Micrometer中计数器指标的动态标签值

21

新手在这里,试图了解更多有关千分尺的知识。我目前正在探索以下方法:

我正在使用启用了actuator和micrometer的Spring boot 2。考虑以下类:

@Component
class MyService {
  @Autowired
  AuthorizeTransaction callbackTransaction;

  @Autowired
  AuthorizeTransaction immediateTransaction;

  private MeterRegistry meterRegistry;
  private Counter requestCounter;
  private Counter responseCounter;

  public MyService(MeterRegistry meterRegistry) {
    this.meterRegistry = meterRegistry;
    initCounters();
  }

  private initCounters() {
    requestCounter = Counter.builder("iso_request")
                      .tags("mti", "0100")  // how do I change the value of this tag for other request types like 0200, 0120, etc.,
                      .register(meterRegistry);
    responseCounter = Counter.builder("iso_response")
                      .tags("mti", "0101")
                      .tags("response_code", "00") // how do I change the value of this tag for other response codes like 01, 09, etc.,
                      .register(meterRegistry);
  }

  public ISOMsg process(ISOMsg request) {
    ISOMsg response = null;

    try {
      switch(request.getMTI()) {  // org.jboss.iso.ISOMsg
        case "0100":
        case "0200":
          if ("0100".equals(request.getMTI())) {
            requestCounter.increment();
          } else {
            requestCounter.increment(); // I want to increment the counter of the same metric with tag mti=0200
          }
          response = immediateTransaction.process(request);
          // here I want to increment the response counter but with different MTIs and response codes
          break;
        case "0120":
        case "0121"
          response = callbackTransaction.process(request);
          break;
        default:
          log.error("error here")
      }
    } catch (Exception e) {
      log.error("error here")
    }

    return response;
  }
}

我被卡住了,需要为每个标签值的组合创建不同的计数器变量,代码可读性变得非常糟糕。我有比上面示例还多的switch case语句。肯定有一种简单的方法来做到这一点,但我找不到。

2个回答

13
要使标签值是“动态”的,请跳过在initCounters()方法中的计数器实例化。每次需要增加计数器时,使用其构建器方法实例化计数器并进行增量操作,例如:
Counter.builder("iso_response")
    .tags("mti", request.getMTI())
    .tags("response_code", myReponseCode)
    .register(meterRegistry)
    .increment();

事实上,正如io.micrometer.core.instrument.Counter.Builder.register方法在其JavaDoc中所述,仅当具有相同标签值的计数器不存在时,才会返回新计数器。这是因为每个注册表都保证只为相同名称和标签组合创建一个计数器

10
您需要使用Builder来计算具有特定标签的内容。以下是方法:
@Component
class MyService {
  @Autowired
  AuthorizeTransaction callbackTransaction;

  @Autowired
  AuthorizeTransaction immediateTransaction;

  private MeterRegistry meterRegistry;
  private Counter.Builder requestCounter;
  private Counter.Builder responseCounter;

  public MyService(MeterRegistry meterRegistry) {
    this.meterRegistry = meterRegistry;
    initCounters();
  }

  private initCounters() {
    requestCounter = Counter.builder("iso_request");
    responseCounter = Counter.builder("iso_response");
  }

  public ISOMsg process(ISOMsg request) {
    ISOMsg response = null;

    try {
      switch(request.getMTI()) {  // org.jboss.iso.ISOMsg
        case "0100":
        case "0200":
          requestCounter.tag("mti", request.getMTI()).registry(meterRegistry);
          response = immediateTransaction.process(request);
          responseCounter.tags("mti", request.getMTI(), "response_code", "0101").registry(meterRegistry);
          // here I want to increment the response counter but with different MTIs and response codes
          break;
        case "0120":
        case "0121"
          response = callbackTransaction.process(request);
          break;
        default:
          log.error("error here")
      }
    } catch (Exception e) {
      log.error("error here")
    }

    return response;
  }
}

思考以下内容:

  • 创建一个类来封装计数器逻辑
  • 使用常量来标记标签

如果可行请告诉我!


8
我认为你仍然需要调用“increment”函数。 - Martín Coll
4
似乎由于建造者对象被缓存,所以不断地添加标签(请参见 io.micrometer.core.instrument.Counter.Builder#tags)。 - Martín Coll
1
为了进行递增,方法.registry(meterRegistry)返回一个计数器,因此您必须在其上调用increment,例如Counter c = responseCounter.tags("mti", request.getMTI(), "response_code", "0101").registry(meterRegistry);然后c.increment()。希望能帮到您 :) - Alex Dobrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接