O ARMS inclui Application Monitoring metrics integradas. Para definir suas próprias métricas, use o OpenTelemetry Java SDK. Este tópico mostra como criar métricas personalizadas e consultá-las no Grafana.
Pré-requisitos
Conecte sua aplicação ao ARMS Application Monitoring. Para mais informações, consulte Application access.
A versão do agente do ARMS deve ser 4.5.0 ou superior.
Adicionar dependências
Adicione as seguintes dependências Maven para importar o OpenTelemetry Java SDK. Para mais detalhes, consulte a documentação oficial do OpenTelemetry.
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.23.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Procedimento
O OpenTelemetry oferece suporte a quatro tipos principais de instrumentos de métrica:
Counter: Registra um valor que só aumenta ao longo do tempo. Use este instrumento para rastrear dados cumulativos, como o número total de requisições HTTP ou erros.
UpDownCounter: Registra um valor que pode aumentar ou diminuir. Use um UpDownCounter para rastrear valores não monotônicos, como a quantidade de conexões ativas ou tarefas em uma fila.
Histogram (Sem suporte): Registra a distribuição estatística de um conjunto de valores, como latência de requisição ou tamanho de resposta. Permite calcular quantis (por exemplo, P90 ou P95).
Gauge: Captura um valor instantâneo em um momento específico. Use um gauge para acompanhar valores que mudam arbitrariamente, como utilização de CPU ou uso de memória.
Etapa 1: Adicionar uma métrica personalizada
O código a seguir apresenta um exemplo simples de aplicação de venda relâmpago e define duas métricas:
product_seckill_count: Quantidade de tentativas de venda relâmpago.product_current_stock: Estoque atual do product.
Ao obter a classe factory meter para definir métricas, transmita o parâmetro product_seckill. Esse parâmetro funciona como identificador de grupo. Todas as métricas definidas posteriormente com esse meter pertencem a esse grupo, utilizado nas configurações seguintes.
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.ObservableLongGauge;
import javax.annotation.PreDestroy;
import java.util.concurrent.atomic.AtomicInteger;
class ProductService {
// Static inventory counter.
public final AtomicInteger stock = new AtomicInteger(0);
private LongCounter seckillCounter;
private ObservableLongGauge observableLongGauge;
private final AttributeKey<String> seckillResult = AttributeKey.stringKey("seckill_result");
public ProductService() {
OpenTelemetry agentOpenTelemetry = GlobalOpenTelemetry.get();
// Define the metric factory class. The 'product_seckill' name is important.
Meter meter = agentOpenTelemetry.getMeter("product_seckill");
// Define a counter to record the number of flash sale attempts.
seckillCounter = meter.counterBuilder("product_seckill_count")
.setUnit("1")
.setDescription("seckill product count")
.build();
// Define a gauge to represent the current product inventory.
observableLongGauge = meter.gaugeBuilder("product_current_stock").ofLongs().buildWithCallback((measurement -> {
// Record the current product quantity.
measurement.record(stock.get());
}));
}
@PreDestroy
public void clear() {
observableLongGauge.close();
}
public void setKillProductCount(int count) {
stock.set(count);
}
public String seckillProduct() {
int currentStock = stock.get();
if (currentStock <= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "failed"));
return "Flash sale failed. The product is sold out.";
}
// Try to decrement the stock.
if (stock.decrementAndGet() >= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "success"));
return "Flash sale successful. Remaining stock: " + stock.get();
} else {
stock.incrementAndGet(); // Rollback.
seckillCounter.add(1, Attributes.of(seckillResult, "failed"));
return "Flash sale failed. The product is sold out.";
}
}
}
Etapa 2: Configure a coleta de métricas
No console, modifique a Custom Metric Collection Configuration adicionando o nome do grupo especificado durante a criação do Meter na etapa anterior.
Essa configuração aplica-se apenas às versões 4.5.0 ou superiores do agente e não exige reinicialização da aplicação. Ao concluir, clique em Salve.
Etapa 3: Visualize métricas e configure alertas
No console do ARMS, acesse a página . Na barra de menu superior, selecione a região onde sua aplicação está implantada. Pesquise a instância de armazenamento do Prometheus cujo nome começa com
metricstore-apm-metrics-custome clique em Shared Edition para abrir o Grafana.-
Na página do Grafana, clique em Explore. Na lista suspensa de source de dados, selecione a instância de armazenamento do Prometheus identificada na etapa anterior.
Na página de pastas do Grafana, caso a pasta esteja vazia, a mensagem
This folder doesn't have any dashboards yetserá exibida. Clique em + Crie Dashboard para adicionar um novo painel ou em Gerencie dashboards para mover um painel existente para essa pasta. -
Use PromQL para consultar as métricas personalizadas definidas no seu código, conforme ilustrado na figura a seguir. Também é possível criar um custom observability dashboard no Grafana.

O ARMS reporta e armazena as métricas personalizadas definidas com o OpenTelemetry SDK na sua instância de armazenamento do Prometheus. Em seguida, crie alert rules para essas métricas.
Observações de uso
O ARMS reporta métricas em intervalos de 15 segundos.
Para métricas do tipo
counter, o ARMS reporta o valor incremental dentro de cada intervalo, e não o total acumulado.