【问题标题】:Custom metrics confusion自定义指标混淆
【发布时间】:2020-03-16 14:32:25
【问题描述】:

我将https://micrometer.io 添加到我们在谷歌云中的登台服务器。该指标未显示在“Cloud Run Revision”资源类型中。仅当我选择此处所示的“全局”时才可见...

说明非常简单明了(非常不像 opencensus,它有一个过度设计的 api)。事实上,与 opencensus 不同的是,它开箱即用,只是它没有记录到“Cloud Run Revision”中。

我什至无法在过滤器中选择 service_name,因此一旦我部署到生产环境,指标将同时记录 prod 和 staging,这不是我们想要的。

  1. 如何进一步调试千分尺
  2. 如果有人知道问题可能是什么,那也很好吗? (虽然我不介意学习千分尺并对其进行更多调试)。

【问题讨论】:

    标签: stackdriver google-cloud-stackdriver micrometer


    【解决方案1】:

    目前,您的自定义指标中唯一的 available monitored-resource types 是:

    • aws_ec2_instance: Amazon EC2 实例。
    • dataflow_job: 数据流作业。
    • gce_instance: Compute Engine 实例。
    • gke_container: GKE 容器实例。
    • generic_node:用户指定的计算节点。
    • generic_task:用户定义的任务。
    • 全局:当没有其他资源类型适合时使用此资源。对于大多数用例,generic_node 或 generic_task 是比 global 更好的选择。
    • k8s_cluster: Kubernetes 集群。
    • k8s_container: Kubernetes 容器。
    • k8s_node: Kubernetes 节点。
    • k8s_pod: Kubernetes pod。

    因此,在这种情况下,global 是正确的受监控资源类型,因为还没有 Cloud Run 受监控资源类型。

    为了更好地识别指标,您可以创建指标描述符,Auto-creationmanually

    【讨论】:

    • 啊,好的,谢谢@Victor_Torres 那么如何将指标报告为来自云运行的 generic_task。我现在正在尝试这样做,指标名称显示为零数据。我知道,如果我不提供所有标签,它会记录有关未写入堆栈驱动程序的警告。我修复了所有警告但没有数据,然后我恢复到全局并且它再次工作。谷歌文档说你真的不应该使用 global 但我不能让其他任何东西工作。
    • 不确定问题是否出在 Stackdriver 中,因为 Global 工作正常,我正在查看 GitHub 中的 micrometersource code,其中提到更新 StackdriverMeterRegistry 以包含generic_task 所需的标签。我建议您打开 GCP 支持案例以放弃 Stackdriver 监控 API 的一些问题。
    • 你的帖子把我推到了山上,我在那里得到了 95%,它报告了 JVM 指标,但现在我不确定它们是否可以正确使用。我为这个新问题创建了一个新帖子stackoverflow.com/questions/60728990/…
    • 另外,@Victor_Torres 在下面发布了我使用通用任务的最终代码,当然在谷歌的 GUI 中聚合指标时遇到了一个新问题。
    【解决方案2】:

    为了完整起见,我现在已经记录了所有 JVM 统计信息,但在 google 的网站上有一篇关于聚合的新帖子,这似乎是一个新问题......

    Google Cloud Metrics and MicroMeter JVM reporting (is this a Micrometer bug or?)

    我的代码做到了这一点(并且使用 revisionName 是 CRITICALL 不出错!!!)

            String projectId = MetadataConfig.getProjectId();
            String service = System.getenv("K_SERVICE");
            String revisionName = System.getenv("K_REVISION");
            String config = System.getenv("K_CONFIGURATION");
            String zone = MetadataConfig.getZone();
    
            Map<String, String> map = new HashMap<>();
            map.put("namespace", service);
            map.put("job", "nothing");
            map.put("task_id", revisionName);
            map.put("location", zone);
    
            log.info("project="+projectId+" svc="+service+" r="+revisionName+" config="+config+" zone="+zone);
    
            StackdriverConfig stackdriverConfig = new OurGoogleConfig(projectId, map);
    
            //figure out how to put in template better
            MeterRegistry googleRegistry = StackdriverMeterRegistry.builder(stackdriverConfig).build();
            Metrics.addRegistry(googleRegistry);
            //This is what would be used in Development Server
            //Metrics.addRegistry(new SimpleMeterRegistry());
            //How to expose on @backend perhaps at /@metrics
    
            CompositeMeterRegistry registry = Metrics.globalRegistry;
            new ClassLoaderMetrics().bindTo(registry);
            new JvmMemoryMetrics().bindTo(registry);
            new JvmGcMetrics().bindTo(registry);
            new ProcessorMetrics().bindTo(registry);
            new JvmThreadMetrics().bindTo(registry);
    

    然后配置就很简单了……

    private static class OurGoogleConfig implements StackdriverConfig {
    
        private String projectId;
        private Map<String, String> resourceLabels;
    
        public OurGoogleConfig(String projectId, Map<String, String> resourceLabels) {
            this.projectId = projectId;
            this.resourceLabels = resourceLabels;
        }
    
        @Override
        public String projectId() {
            return projectId;
        }
        @Override
        public String get(String key) {
            return null;
        }
        @Override
        public String resourceType() {
            return "generic_task";
        }
    
        @Override
        public Map<String, String> resourceLabels() {
            //they call this EVERY time, so save on memory by only passing the same
            //map every time instead of re-creating it...
            return resourceLabels;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多