首页 > 解决方案 > 自定义指标使用千分尺发送 datadog DatadogRegistry 未显示在 Datadog 指标摘要中

问题描述

我想使用 io.micrometer.datadog.DatadogMeterRegistry 将自定义指标发送到 datadog。下面是我向 Datadog 发送指标的方法的代码片段。

@Override
    public void emitMetrices(Map<String, String> dataPoints) {
        try {
            logger.info("inside emitMetrices from monitoring service with enableCustomMetrics: {}",
                    enableCustomMetrics);
            if (!isEnabled()) {
                logger.warn("Metrics are diabled");
                return;
            }

            // user supplied metrics
            Set<Tag> tags = new LinkedHashSet<Tag>();
            Set<Entry<String, String>> dataPointEntries = dataPoints.entrySet();
            for (Entry<String, String> entry : dataPointEntries) {
                String key = entry.getKey() == null ? MetricConstants.UNKNOWN_TEXT : entry.getKey();
                String value = entry.getValue() == null ? MetricConstants.UNKNOWN_TEXT : entry.getValue();
                tags.add(new ImmutableTag(key, value));
            }

            String tenantMoniker = MetricConstants.UNKNOWN_TEXT;
            String stackName = MetricConstants.UNKNOWN_TEXT;

            TenantDescriptor tenant = TenantContextHolder.get();
            if (tenant != null) {
                tenantMoniker = tenant.getTenantMoniker();
                stackName = tenant.getTierName();
            } else {
                logger.warn("Tenant is not available");
            }

            Tag tenantTag = new ImmutableTag(MetricConstants.TENANT_MONIKER, tenantMoniker);
            Tag stackNameTag = new ImmutableTag(MetricConstants.STACK_NAME, stackName);
            Tag serviceNameTag = new ImmutableTag(MetricConstants.SERVICE_NAME, serviceName);

            tags.add(tenantTag);
            tags.add(stackNameTag);
            tags.add(serviceNameTag);

            logger.info("sending metric to datadog");
            Counter counter = meterRegistry.counter(METRIC_NAME, tags);
            counter.increment();

            logger.info("metric sent successfully: {}", METRIC_NAME);

        } catch (Exception e) {
            logger.error("Error publishing metrics", e);
        }

    }

我能够看到日志“指标发送成功”且没有错误,但此自定义指标未显示在 Datadog UI 中的指标摘要下。我错过了什么吗?

标签: javaspring-bootdatadogmicrometer

解决方案


MeterRegistry 已经实现了如何发送自定义指标(发布到 DataDog)参见代码https://github.com/micrometer-metrics/micrometer/blob/master/implementations/micrometer-registry-datadog/src/main/java/ io/micrometer/datadog/DatadogMeterRegistry.java#L133

您似乎正在尝试向每个指标添加通用标签。也许您不应该实现自己的 DataDog 注册表,而是使用提供的注册表来发送指标并通过 config 设置公共标签:

registry.config().commonTags(Arrays.asList(
  Tag.of(MetricConstants.TENANT_MONIKER, tenant.getTenantMoniker()), 
  Tag.of(MetricConstants.STACK_NAME, stackName)
));

推荐阅读