Skip to content

15.3.3 Đăng ký các chỉ số tùy chỉnh

Trong phần 15.2.4, chúng ta đã xem xét cách bạn có thể điều hướng đến endpoint /metrics để sử dụng các chỉ số khác nhau được Actuator công bố, với trọng tâm là các chỉ số liên quan đến các yêu cầu HTTP. Các chỉ số được cung cấp bởi Actuator rất hữu ích, nhưng endpoint /metrics không chỉ giới hạn trong các chỉ số được tích hợp sẵn.

Cuối cùng, các chỉ số của Actuator được triển khai bởi Micrometer https://micrometer.io/, một giao diện đo lường trung lập với nhà cung cấp giúp các ứng dụng có thể công bố bất kỳ chỉ số nào họ muốn và hiển thị chúng trên hệ thống giám sát bên thứ ba theo lựa chọn, bao gồm hỗ trợ cho Prometheus, Datadog, và New Relic, cùng nhiều hệ thống khác.

Cách cơ bản nhất để công bố chỉ số với Micrometer là thông qua MeterRegistry của Micrometer. Trong một ứng dụng Spring Boot, tất cả những gì bạn cần làm để công bố chỉ số là inject một MeterRegistry ở bất kỳ đâu bạn cần công bố các bộ đếm (counter), bộ định thời gian (timer), hoặc bộ đo (gauge) nhằm thu thập các chỉ số cho ứng dụng của bạn.

Ví dụ về việc công bố chỉ số tùy chỉnh, giả sử bạn muốn giữ các bộ đếm số lượng taco đã được tạo ra với các nguyên liệu khác nhau. Tức là, bạn muốn theo dõi có bao nhiêu taco đã được làm với rau diếp, thịt bò xay, bánh tortilla bột mì, hoặc bất kỳ nguyên liệu nào có sẵn. Bean TacoMetrics trong đoạn liệt kê tiếp theo cho thấy bạn có thể sử dụng MeterRegistry để thu thập thông tin đó như thế nào.

Đoạn liệt kê 15.6 TacoMetrics đăng ký các chỉ số liên quan đến nguyên liệu taco

java
package tacos.tacos;
import java.util.List;
import
org.springframework.data.rest.core.event.AbstractRepositoryEventListener;
import org.springframework.stereotype.Component;
import io.micrometer.core.instrument.MeterRegistry;

@Component
public class TacoMetrics extends AbstractRepositoryEventListener<Taco> {
  private MeterRegistry meterRegistry;
  public TacoMetrics(MeterRegistry meterRegistry) {
    this.meterRegistry = meterRegistry;
  }

  @Override
  protected void onAfterCreate(Taco taco) {
    List<Ingredient> ingredients = taco.getIngredients();
    for (Ingredient ingredient : ingredients) {
      meterRegistry.counter("tacocloud",
        "ingredient", ingredient.getId()).increment();
    }
  }
}

Như bạn có thể thấy, TacoMetrics được inject qua constructor với một MeterRegistry. Nó cũng mở rộng từ AbstractRepositoryEventListener, một lớp của Spring Data cho phép can thiệp vào các sự kiện của repository và override phương thức onAfterCreate() để nó có thể được thông báo bất cứ khi nào một đối tượng Taco mới được lưu.

Bên trong onAfterCreate(), một bộ đếm được khai báo cho mỗi ingredient (nguyên liệu), trong đó tên tag là ingredient và giá trị tag bằng với ID của nguyên liệu đó. Nếu một bộ đếm với tag đó đã tồn tại, nó sẽ được tái sử dụng. Bộ đếm sẽ được tăng lên, cho biết rằng một chiếc taco khác đã được tạo với nguyên liệu đó.

Sau khi một vài chiếc taco được tạo ra, bạn có thể bắt đầu truy vấn endpoint /metrics để biết số lượng của từng nguyên liệu. Một yêu cầu GET đến /metrics/tacocloud sẽ trả về một số chỉ số chưa lọc, như được hiển thị sau đây:

bash
$ curl localhost:8087/actuator/metrics/tacocloud
{
  "name": "tacocloud",
    "measurements": [ { "statistic": "COUNT", "value": 84 }
  ],
  "availableTags": [
    {
      "tag": "ingredient",
      "values": [ "FLTO", "CHED", "LETC", "GRBF",
                  "COTO", "JACK", "TMTO", "SLSA"]
    }
  ]
}

Giá trị đếm dưới phần measurements không có nhiều ý nghĩa ở đây, vì nó là tổng của tất cả các đếm cho mọi nguyên liệu. Nhưng giả sử bạn muốn biết có bao nhiêu chiếc taco đã được tạo ra với bánh tortilla bột mì (FLTO). Tất cả những gì bạn cần làm là chỉ định tag ingredient với giá trị là FLTO như sau:

bash
$ curl localhost:8087/actuator/metrics/tacocloud?tag=ingredient:FLTO
{
  "name": "tacocloud",
  "measurements": [
    { "statistic": "COUNT", "value": 39 }
  ],
  "availableTags": []
}

Bây giờ rõ ràng là có 39 chiếc taco đã sử dụng bánh tortilla bột mì như một trong các nguyên liệu.

Released under the MIT License.