微米计数器指标的动态标记值

Vim*_*vam 10 java spring-boot-actuator micrometer prometheus-java

新手在这里,试图了解有关千分尺的更多信息。我目前正在探索如何实现这一点:

我正在使用启用了执行器和千分尺的 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我被困在这里,必须为每个标签值组合创建不同的计数器变量,并且代码的可读性受到非常严重的影响。我有很多 switch case 语句,而不是上面的例子。绝对应该有一个简单的方法来做到这一点,但是我找不到。

Mar*_*idt 13

要获得“动态”标记值,只需跳过方法中计数器的实例化即可initCounters()。每次增加计数器时,使用其构建器方法实例化一个计数器并递增,例如:

Counter.builder("iso_response")
    .tags("mti", request.getMTI())
    .tags("response_code", myReponseCode)
    .register(meterRegistry)
    .increment();
Run Code Online (Sandbox Code Playgroud)

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


RUA*_*ult 5

如果要使用Builder特定标签进行计数,则必须使用 a 。这是如何:

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

想一想:

  • 创建一个类来封装你的 Counter 逻辑
  • 为您的标签使用常量

让我知道它是否有效!

  • 在我看来,你仍然需要调用 `increment` (3认同)
  • 似乎由于构建器被缓存,标签被不断添加(参见“io.micrometer.core.instrument.Counter.Builder#tags”)。 (2认同)