Envie dados de monitoramento para o Managed Service for Prometheus por meio do Pushgateway. Essa abordagem é ideal para fontes de dados que não permitem coleta periódica.
Visão geral da solução
Se sua fonte de dados não puder ou não dever ser coletada periodicamente pelo Prometheus Server, como em ambientes sem conectividade de rede estável, use o Pushgateway. A fonte de dados envia as informações de monitoramento para o Pushgateway e o Prometheus Server as recupera em intervalos regulares. Siga estas etapas:
Obter o endpoint do Pushgateway: obtenha o endpoint do Pushgateway no console do Managed Service for Prometheus.
Reportar dados: use o comando curl ou um SDK open source para enviar os dados. Garanta que o Prometheus colete e monitore as métricas de forma rápida e confiável.
-
Adicionar configuração de proteção de dados (opcional): o protocolo padrão do Pushgateway não inclui recursos de proteção de dados. O SDK do Pushgateway suporta apenas autenticação básica (Basic Auth) e não oferece métodos avançados ou padronizados. Qualquer cliente com acesso ao endpoint do Pushgateway consegue enviar dados. Para proteger suas informações, obtenha um token no console do Managed Service for Prometheus e implemente a autenticação padrão baseada em JWT.
Pré-requisitos
Você já criou uma instância do Prometheus. Para mais informações, consulte:
Etapa 1: Obter o endpoint do Push Gateway
Acesse o console do Cloud Monitor. No painel de navegação à esquerda, escolha Managed Service for Prometheus > Instances. A página Instances será exibida.
Na barra de menus na parte superior da página, selecione a região onde reside sua instância do Prometheus. Na coluna Actions do cluster de destino, clique em Settings.
-
Na aba Settings, localize a seção Pushgateway URL e copie a URL pública.
Esta seção também fornece uma URL do Push Gateway para rede privada. Escolha a URL adequada conforme seu ambiente de rede.
Etapa 2: Reportar dados
Versão V1
Enviar dados com um SDK open source
Atualmente, o protocolo de dados suporta Text Format e Protobuf Delimited. Não há suporte para Protobuf Text, Protobuf Compact-Text ou OpenMetrics. Os SDKs geralmente usam Protobuf Delimited como padrão.
Os metadados HELP das métricas não aceitam caracteres chineses. Se o campo HELP contiver esses caracteres, o envio de dados falhará.
Os exemplos abaixo em Go e Java demonstram como enviar métricas usando um SDK open source.
Exemplo em Go:
completionTime := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "db_backup_last_completion_timestamp_seconds",
Help: "The timestamp of the last successful completion of a DB backup.",
})
completionTime.SetToCurrentTime()
url : = "https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
fmt.Println("Could not push completion time to PushGateway: ", err)
}
Exemplo em Java:
CollectorRegistry registry = new CollectorRegistry();
Gauge duration = Gauge.build()
.name("my_batch_job_duration_seconds").help("Duration of my batch job in seconds.").register(registry);
Gauge.Timer durationTimer = duration.startTimer();
try {
// Your code here.
// This is only added to the registry after success,
// so that a previous success in the Pushgateway isn't overwritten on failure.
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry);
lastSuccess.setToCurrentTime();
} finally {
durationTimer.setDuration();
PushGateway pg = new PushGateway(new URL("https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"));
pg.pushAdd(registry, "my_batch_job");
}
Ao usar um SDK open source e inserir o endpoint do Pushgateway obtido no console do Prometheus Monitoring, o sistema adiciona automaticamente um sufixo como
/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}. Caso não utilize um SDK open source, adicione esse sufixo manualmente. Do contrário, você receberá um erro 404.Se você enviar dados para um cluster de tenant compartilhado do Managed Service for Prometheus, todas as métricas devem incluir o rótulo
tenant_userid=****. O valor da tag deve corresponder ao ID da conta Alibaba Cloud (ou seja, o ID da conta raiz) à qual a métrica pertence. Isso distingue a propriedade da métrica.
Enviar dados com o comando curl
O tipo de requisição application/x-www-form-urlencoded não é suportado. No comando curl, adicione um cabeçalho especificando Content-Type: text/plain; version=0.0.4; charset=utf-8.
echo "some_metric 3.14" | curl -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" --data-binary @- https://cn-hangzhou.arms.aliyuncs.com/prometheus/51bbea9ck41b9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2/metrics/job/job_name/label_key_1/label_value_1/label_key_2/label_value_2
É possível anexar vários rótulos à URL, mas mantenha o comprimento total dentro dos limites permitidos.
Substitua “job_name” na URL pelo nome real do seu job.
Adicionar configuração de proteção de dados (opcional)
-
Obter um token: no painel de navegação à esquerda, escolha Settings. Na aba Settings, na seção Token, clique em Generate Token.
-
Transmitir o token: após gerar o token, utilize um dos métodos a seguir para transmiti-lo.
-
Método 1: defina o token no cabeçalho da requisição do cliente para enviar dados normalmente. Caso contrário, o sistema rejeitará a requisição de escrita. Utilize o seguinte formato de cabeçalho:
Authorization: Bearer <token> -
Método 2: o SDK do Pushgateway suporta apenas Basic Auth e não oferece suporte a JWT. Para usar o SDK com autenticação, utilize a interface BasicAuth e defina a senha como o token. O servidor aceita esse método de autenticação. O Método 1 exige esforço adicional de desenvolvimento. O exemplo abaixo utiliza o SDK Go.
pusher := push.New(url, "test"). Collector(completionTime).Client(http.DefaultClient). Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/"). .BasicAuth("admin", "actual token value"). Format(expfmt.FmtProtoDelim)
-
Versão V2
1. Conceder permissão de leitura e gravação do CMS a um usuário RAM
Se sua instância do Prometheus na Alibaba Cloud foi criada por uma conta Alibaba Cloud e você precisa usar o AccessKey ID e o AccessKey secret de um usuário RAM para operações remotas de leitura e gravação, conceda primeiro a permissão de leitura e gravação do CMS ao usuário RAM.
Acesse o console do Resource Access Management (RAM) usando uma conta Alibaba Cloud ou um administrador RAM. No painel de navegação à esquerda, escolha .
-
Na página Authorization, clique em Create Authorization. Na página Create Authorization, configure os parâmetros a seguir.
Parâmetro
Descrição
Resource Scope
Selecione um escopo de recursos conforme necessário.
Principal
Selecione o usuário RAM que deseja autorizar.
Policy
Selecione AliyunPrometheusMetricWriteAccess ou AliyunCloudMonitorFullAccess.
Clique em OK e, em seguida, clique em Close.
2. Enviar dados
Enviar dados com um SDK open source
Atualmente, o protocolo de dados suporta Text Format e Protobuf Delimited. Não há suporte para Protobuf Text, Protobuf Compact-Text ou OpenMetrics. Os SDKs geralmente usam Protobuf Delimited como padrão.
Os metadados HELP das métricas não aceitam caracteres chineses. Se o campo HELP contiver esses caracteres, o envio de dados falhará.
Os exemplos abaixo em Go e Java demonstram como enviar métricas usando um SDK open source.
Exemplo em Go:
completionTime := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "db_backup_last_completion_timestamp_seconds",
Help: "The timestamp of the last successful completion of a DB backup.",
})
completionTime.SetToCurrentTime()
url : = "https://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway"
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
BasicAuth("ak", "sk").
Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
fmt.Println("Could not push completion time to PushGateway: ", err)
}
Exemplo em Java:
CollectorRegistry registry = new CollectorRegistry();
Gauge duration = Gauge.build()
.name("my_batch_job_duration_seconds").help("Duration of my batch job in seconds.").register(registry);
Gauge.Timer durationTimer = duration.startTimer();
try {
// Your code here.
// This is only added to the registry after success,
// so that a previous success in the Pushgateway isn't overwritten on failure.
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry);
lastSuccess.setToCurrentTime();
} finally {
durationTimer.setDuration();
PushGateway pg = new PushGateway(new URL("https://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway"));
pg.setConnectionFactory(new BasicAuthHttpConnectionFactory("ak", "sk"));
pg.pushAdd(registry, "my_batch_job");
}
Ao usar um SDK open source e inserir o endpoint do Pushgateway obtido no console do Prometheus Monitoring, o sistema adiciona automaticamente um sufixo como
/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}. Caso não utilize um SDK open source, adicione esse sufixo manualmente. Do contrário, você receberá um erro 404.Se você enviar dados para um cluster de tenant compartilhado do Managed Service for Prometheus, todas as métricas devem incluir o rótulo
tenant_userid=****. O valor da tag deve corresponder ao ID da conta Alibaba Cloud (ou seja, o ID da conta raiz) à qual a métrica pertence. Isso distingue a propriedade da métrica.A operação de API suporta autenticação via Security Token Service (STS). Nesse caso, a senha no BasicAuth utiliza o formato
{AccessKey Secret}${STS Token}.
Enviar dados com o comando curl
O tipo de requisição application/x-www-form-urlencoded não é suportado. No comando curl, adicione um cabeçalho especificando Content-Type: text/plain; version=0.0.4; charset=utf-8.
echo "some_metric 3.14" | curl -u 'ak:sk' -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" --data-binary @- https://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway/metrics/job/job_name/label_key_1/label_value_1/label_key_2/label_value_2
É possível anexar vários rótulos à URL, mas mantenha o comprimento total dentro dos limites permitidos.
Substitua “job_name” na URL pelo nome real do seu job.
Verificar resultados
Use o Grafana para confirmar se os dados foram enviados com sucesso.
Acessar o painel ApiServer: no painel de navegação à esquerda, selecione Dashboards. Em seguida, clique no hyperlink do painel ApiServer. O sistema redirecionará você para a página do painel.
-
Selecionar Explore para visualizar dados: na página do painel, passe o mouse sobre o ícone
no painel de navegação à esquerda. Na caixa pop-up, clique em Explore. No lado direito da página Explore, use o menu suspenso para selecionar a instância Explore correspondente e verifique se os dados foram enviados com sucesso.No campo Metrics, insira o nome da métrica enviada (como
db_backup_last_completion_timestamp_seconds). Defina Query type como Range. Após clicar em Run, se uma curva aparecer na área Graph abaixo, os dados foram enviados com sucesso.