aws eks中cwagent收集性能日志的理解

news2024/11/18 0:46:09

参考资料

  • CloudWatch代理配置参考
  • Prometheus的CloudWatch代理配置

本文旨在明确以下几个问题

  1. eks的container insight addon包括哪些组件?分别起什么作用?
  2. eks的cwagent的指标获取具体包括那些部分?数据源是什么?
  3. eks的cwagent如何获取eks性能指标?
  4. eks的cwagent如何将采集的eks性能指标发送到cloudwatch?
  5. eks的cwagent如何获取peometheus相关exporter指标?
  6. eks的cwagent如何将采集的promethes指标发送到cloudwatch?

建议不要跳读,本文总体结构如下图

image.png

逻辑上container insight需要收集三部分内容,包括指标,追踪和日志。负责这三部分数据的组件分别为cwagent(前两者)和fluentbit,这里我们只讨论cwagent的运行过程。

总的来看,container insight能够获取的指标包括两部分:1. eks性能指标。2. prometheus指标

eks基本性能指标

我们首先来看开启安装container insight addon之后获取的eks基本指标部分。

首先简单解释下emf日志,emf可以理解为aws定义的指标数据格式,当按照emf规范发送日志文件到cw log(api为PutLogEvents)时,会自动在cw的对应namespace中生成指标。例如示例中的程序运行之后,会在MyApp命名空间下生成指标ProcessingLantency

也就是说cwagent在收集eks性能指标和prometheus指标时,是通过性能日志的方式发送到cwlog,然后由cw来异步生成自定义指标

开启可观察性addon之后,查看eks中cwagent的默认配置如下,其中有个参数叫enhanced_container_insights

{"agent":{"region":"cn-north-1"},"logs":{"metrics_collected":{"app_signals":{"hosted_in":"test127"},"kubernetes":{"cluster_name":"test127","enhanced_container_insights":true}}},"traces":{"traces_collected":{"app_signals":{}}}}

让我们来看一下这个名为enhanced_container_insights的参数具体是在做什么?首先是这个translate函数,从注释中可以看出该函数会将集群中cwagent的cm配置文件转换为otel配置。因此,实际上cwagent上传emf格式的日志文件直接复用了otel exporter的逻辑,可以直接将其看作otel collector的exporter部分。关于otel的内容,可以将其理解为数据管道,从不同的source接受指标数据,在经过处理后发送到不同的exporter中。

// Translate creates an awsemf exporter config based on the input json config
func (t *translator) Translate(c *confmap.Conf) (component.Config, error) {

这一点实际在cwagent的日志中已经出现端倪,例如其中的kind":"exporter","data_type":"metrics

2024-04-13T10:39:58Z I! {"caller":"awsemfexporter@v0.89.0/emf_exporter.go:119","msg":"Start processing resource metrics","kind":"exporter","data_type":"metrics","name":"awsemf/containerinsights","labels":{"http.scheme":"https","k8s.namespace.name":"amazon-cloudwatch","net.host.name":"neuron-monitor-service.amazon-cloudwatch.svc","
net.host.port":"8000","service.instance.id":"neuron-monitor-service.amazon-cloudwatch.svc:8000","service.name":"containerInsightsNeuronMonitorScraper"}}                         

而以下判断环境的标准,就是cwagent配置文件的metrics_collected部分是否有对应的字段

// 环境的判断逻辑
if t.isAppSignals(c) {
    defaultConfig = getAppSignalsConfig()
} else if isEcs(c) {
    defaultConfig = defaultEcsConfig
} else if isKubernetes(c) {
    defaultConfig = defaultKubernetesConfig // 对应enhanced_container_insights的部分
} else if isPrometheus(c) {
    defaultConfig = defaultPrometheusConfig
} else {
    return cfg, nil
}
// 具体的判断逻辑如下,prometheus指标对应的就是EMFProcessorKey这部分配置
prometheusBasePathKey   = common.ConfigKey(common.LogsKey, common.MetricsCollectedKey, common.PrometheusKey)
emfProcessorBasePathKey = common.ConfigKey(prometheusBasePathKey, common.EMFProcessorKey)
// 字段实际代表的字面值
MetricsCollectedKey                = "metrics_collected"
PrometheusKey                      = "prometheus"
EMFProcessorKey                    = "emf_processor"

最终转换之后的yaml文件为示例文件,这也是性能日志组名称为/aws/containerinsights/{ClusterName}/performance来由

按照以上逻辑,那么最终转换后的cwagent配置也需要按照otel emfexporter的配置方式进行配置,并且最终的eks性能日志种类和配置文件也能逐一对应上。

综上所述,一个简单的enhanced_container_insights参数实际上会生成一系列的eks性能日志,这暂时和prometheus没有关系。

eks中的prometheus指标

实际上文档中明确提到cwagent针对prometheus指标进行了定制,“支持Prometheus 的 CloudWatch 代理可发现并收集 Prometheus 指标”

那什么叫适用于prometheus的cwagent?eks集群中的组件cwagent-prometheus和cwagent有什么区别?

实际上,cwagent需要两种配置来抓取prometheus指标

  • prometheus配置文件
  • cwagent配置文件

这个cwagent-prometheus和通过addon默认安装的cwagent是两个相同的容器,区别仅仅是配置文件不同,字段从kubernetes变更为prometheus。配置文件如下,这部分对应文档中提到的默认支持的组件指标

  • 以下配置文件的解释参考,会匹配prometheus上带有Service标签的指标,并检查内容是否符合label_matcher的正则表达式 规则
{                                                                               
  "logs": {                                                                     
    "metrics_collected": {                                                      
      "prometheus": {                                                           
        "prometheus_config_path": "/etc/prometheusconfig/prometheus.yaml",      
        "emf_processor": {                                                      
          "metric_declaration": [    
              "source_labels": ["Service"],
			  "label_matcher": ".*nginx.*",
              ...
        }

结合上面的结论和pod日志,可见prometheus同样是通过otel exporter发送的,只不过这里的name为awsemf/prometheus。prometheus性能日志日志组为/aws/containerinsights/{ClusterName}/prometheus

2024-04-13T11:01:04Z I! {"caller":"awsemfexporter@v0.89.0/emf_exporter.go:164","msg":"Finish processing resource metrics","kind":"exporter","data_type":"metrics","name":"awsemf/prometheus","labels":{}}

我们来看cwagent-prometheus的日志,首先将配置文件转换为toml,之后再将其转换为yaml文件

2024/04/13 14:28:32 I! Config has been translated into TOML /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
2024/04/13 14:28:32 I! Config has been translated into YAML /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.yaml

最终形成的文件确实是otel的exporter配置

exporters:
    awsemf/prometheus:
    	...
        log_group_name: /aws/containerinsights/<cluster-name>/prometheus
		log_stream_name: '{JobName}'
		...

和eks性能日志相比,有一点显著的不同。即eks性能日志的指标来源来自于cadvisor,实例/proc,pod本身,apiserver。而prometheus的指标来自于应用程序的exporter

因此知道了cwagent如何将prometheus指标发送到cw,下一个问题是cwagent从哪里获取到prometheus指标呢?

以ecs中的java/JMX指标为例,jvm指标实际上是通过JMX Exporter获取到的,并通过指定端口暴露为promethes格式的指标文本,cwagent则会抓取这些指标并发送到cw log中

  • ecs中的支持prometheus的cwagent并不是托管,开启container insight并不会自动捕获这部分指标,需要额外部署sidecar
  • 如果需要捕获任务的prometheus指标,需要指定任务容器的dockerLabels,包括ECS_PROMETHEUS_EXPORTER_PORT(任务的prometheus指标暴露的端口)和Java_EMF_Metrics(是否开启cwagent的emf嵌入式指标收集)
  • 示例模板中显示cwagent的配置文件中,prometheus部分代表cwagent对prometheus指标的服务发现配置,emf_processor部分则代表导出emf日志的匹配逻辑,如果任务的dockerLables中包括Java_EMF_Metrics,则会将prometheus导出为emf日志

同样eks的示例中可以看到cwagent-prometheus(支持prometheus)会从 http://CLUSTER_IP:9404/metrics收集指标,其中9404是jmx导出器的默认端口

  • apiserver中的指标是cwagent通过kubernetes_sd_config中的pod部分自动发现的(这部分类似于prometheus的运行逻辑),具体的配置为名为prometheus-config的configmap
  • 可见在eks中cwagent首先通过服务发现获取pod指标,然后将其转化为emf格式发送到cwlog,之后通过emf的异步加载机制转化为cw指标

在cwagent的plugins/inputs/prometheus部分存在如下逻辑,可见即使不安装prometheus,cwagent-prometheus也能够使用标准的prometheus配置文件来获取相关的指标(cwagent支持标准的prometheus抓取配置)。这应该也是cwagent-prometheus要用到prometheus配置文件的原因。作为印证,这篇文档也提到了prometheus工作负载的安全组要求,访问方向为cwagent-prometheus访问具体的pod

以下是相关的代码片段

// Start scraping prometheus metrics from prometheus endpoints
p.wg.Add(1)
go Start(p.PrometheusConfigPath, receiver, p.shutDownChan, &p.wg, mth)

为了进一步验证我们部署JMX应用,这里直接使用arthas的demo程序

wget https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

构建镜像

FROM openjdk:8-jre-alpine

RUN mkdir -p /opt/jmx_exporter

COPY ./jmx_prometheus_javaagent-0.19.0.jar /opt/jmx_exporter
COPY ./math-game.jar /opt/jmx_exporter
COPY ./start_exporter_example.sh /opt/jmx_exporter
COPY ./config.yaml /opt/jmx_exporter

RUN chmod -R o+x /opt/jmx_exporter
RUN apk add curl

ENTRYPOINT exec /opt/jmx_exporter/start_exporter_example.sh

配置文件为

---
rules:
 - pattern: ".*"

启动脚本为

$ cat start_exporter_example.sh 
java -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.19.0.jar=9404:/opt/jmx_exporter/config.yaml -jar /opt/jmx_exporter/math-game.jar

在eks上部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app4jvmexporter
  namespace: default
  labels:
    app: app4jvmexporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app4jvmexporter
  template:
    metadata:
      labels:
        app: app4jvmexporter
    spec:
      restartPolicy: Always
      containers:
      - name: app4jvmexporter
        image: xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/jmxtest
        imagePullPolicy: Always

使用以下命令验证JVM pod指标暴露

curl http://192.168.0.128:9404/metric
# HELP java_lang_MemoryPool_UsageThresholdSupported java.lang:name=Metaspace,type=MemoryPool,attribute=UsageThresholdSupported
# TYPE java_lang_MemoryPool_UsageThresholdSupported untyped
java_lang_MemoryPool_UsageThresholdSupported{name="Metaspace",} 1.0
java_lang_MemoryPool_UsageThresholdSupported{name="Eden Space",} 0.0
...

在实际scrap时出现指标不支持的问题,参考trouble shooting手段修改cwagent为debug模式查看具体丢弃的指标

2024-04-13T16:41:17Z D! [6/1000] Unsupported Prometheus metric: coredns_dns_request_duration_seconds_bucket with type: histogram

索性直接在原来的prometheus配置文件后面添加静态配置,ip地址是jmx pod的ip

- job_name: 'test-jmx-pod'
      static_configs:
      - targets: ["192.168.0.128:9404"]

查看日志实际上已经抓取到了,但是由于缺少metaData导致无法处理。经过测试这个和规则的标签有关,添加额外的relabel之后解决

2024-04-13T16:54:09Z E! metricsHandler NO metaData for jvm_memory_pool_allocated_bytes_created | 192.168.0.128:9404 | test-jmx-pod        

之后出现类似以下报错,表明cwagent的metric declaration部分没有match

2024-04-13T16:59:02Z D! {"caller":"awsemfexporter@v0.89.0/metric_translator.go:285","msg":"Dropped batch of metrics: no metric declaration matched labels","kind":"exporter","data_type":"metrics
","name":"awsemf/prometheus","Labels":"{\"ClusterName\":\"test127\",\"instance\":\"192.168.0.128:9404\",\"job\":\"test-jmx-pod\",\"prom_metric_type\":\"gauge\",\"state\":\"NEW\"}","Metric Names
":["jvm_threads_state"]}                                                                              

典型的性能日志如下

{
    "ClusterName": "test127",
    "Timestamp": "1713027659523",
    "Version": "0",
    "instance": "192.168.0.128:9404",
    "job": "test-jmx-pod",
    "jvm_memory_pool_bytes_committed": 1310720,
    "jvm_memory_pool_bytes_init": 0,
    "jvm_memory_pool_bytes_max": 1073741824,
    "jvm_memory_pool_bytes_used": 1131256,
    "pool": "Compressed Class Space",
    "prom_metric_type": "gauge"
}                              

既然cwagent-prometheus能够抓取prometheus指标,那我们可以进一步定制指标吗?当然可以,文档中有个配置获取prometheus抓取apiserver的例子,最终发送的指标在ContainerInsights/Prometheus名称空间中

最后,知道了cwagent-prometheus是使用标准配置文件配置scrap job的,那么回过头来看cwagent获取eks集群性能日志这个逻辑,它是怎么获取这部分数据的呢?显然cwagent原生是没有这个能力的,所以标准配置文件中看不到这部分内容,这也是kubernetes和prometheus字段在这里不存在的原因。

既然cwagent能够抓取类似apiserver,cadvisor指标,那么就必然有个源头。结合上面的逻辑,很容易想到cwagent同样是通过prometheus的scrap任务获取eks性能日志的,并且通过直接和kubernetes服务发现功能集成实现无缝对接。只不过这里的prometheus配置文件是默认配置。

我们进一步来看cwagent为什么能够使用prometheus配置文件,参考adot文档的prometheus配置部分,和集群中cwagent-prometheus的配置简直如出一辙,那么我们就有理由猜测,不仅仅是导出到emf这部分,包括获取利用集群服务发现获取prometheus规范指标同样是利用otel的receiver来实现的

To monitor your Kubernetes applications and clusters, we specifically use the kubernetes_sd_configs. We can choose between various Kubernetes objects to discover and scrape including endpoints, pods, nodes, services and ingresses. For each of these objects, we provide a default configuration.

The Prometheus Receiver monitors each applications deployment using the service endpoints. Specifically, it scrapes and collects metrics from the /metrics endpoint

在receiver代码部分同样存在translate逻辑,并且显然不是emf exporter的配置参数

"WithKubernetes": {
    input: map[string]interface{}{
        "logs": map[string]interface{}{
            "metrics_collected": map[string]interface{}{
                "kubernetes": map[string]interface{}{
                    "metrics_collection_interval": float64(10),
                    "cluster_name":                "TestCluster",
                },
            },
        },
    },
    want: &awscontainerinsightreceiver.Config{
        ContainerOrchestrator:        eks,
        CollectionInterval:           10 * time.Second,
        ClusterName:                  "TestCluster",
        LeaderLockName:               "cwagent-clusterleader",
        LeaderLockUsingConfigMapOnly: true,
        TagService:                   true,
    },
},

然后我们根据关键词awscontainerinsightreceiver就找到了cw对于otel的贡献部分,这里有一个专门的receiver名叫awscontainerinsightreceiver,所以cwagent实际上是复用了otel的receiver来获取性能指标的。

此外还有额外收获,"ECS 代理和 CloudWatch 代理支持 CloudWatch Container Insights,以收集许多资源(如 CPU、内存、磁盘和网络)的基础设施指标"这句话也解释了为什么我们在ecs中开启consight insight之后就拥有了收集容器指标的超能力,原来一切都是美好的otel

AWS Container Insights Receiver (awscontainerinsightreceiver) is an AWS specific receiver that supports CloudWatch Container Insights. CloudWatch Container Insights collect, aggregate, and summarize metrics and logs from your containerized applications and microservices.

The collector process needs root permission to be able to read the content of the files. This requirement comes from the fact that this component is based on cAdvisor.

综上看来,cwagent远比想象中能做的事更多, 通过集成otel库扩展了原有能力,能够对指标,日志和追踪进行全方位的支持。可以认为cwagent镜像就是个定制过的otel collector

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1708234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NumPy】全面解析NumPy的where函数:高效条件操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

5-26作业

网络聊天室 服务器&#xff1a; 1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 if(argc!3)5 {6 printf("请输入IP和端口号\n");7 return -1;8 }9 int sfd socket(AF_INET, SOCK_DGRAM, 0);10 if(…

汇编:循环结构

16位汇编语言中的循环结构主要通过条件跳转指令&#xff08;如LOOP、JMP, JE, JNE, JG, JL, 等&#xff09;来实现&#xff0c;常见的循环类型包括for循环和while循环&#xff1b; Loop指令 LOOP指令的操作非常简单&#xff1a;它将CX寄存器的值减1&#xff0c;如果结果不为零…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…

[Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件

如下&#xff0c;我们有一个platform.pk8和platform.x509.pem。为了打包&#xff0c;需要将私钥&#xff08;.pk8&#xff09;和公钥证书&#xff08;可能是.pem或.crt文件&#xff09;合并成一个PKCS#12 格式的密钥库文件 1.准备你的私钥和证书文件 确保你有以下两个文件&…

【论文阅读】xLSTM: Extended Long Short-Term Memory

xLSTM: Extended Long Short-Term Memory 引用&#xff1a; Beck M, Pppel K, Spanring M, et al. xLSTM: Extended Long Short-Term Memory[J]. arXiv preprint arXiv:2405.04517, 2024. 论文链接&#xff1a; [2405.04517] xLSTM: Extended Long Short-Term Memory (arxiv.…

Nocobase快速上手 -第一个collection

本文记录Nocobase中如何创建collection&#xff0c;以及如何将collection展示到页面中&#xff0c;并且配置CRUD相应的操作. Collection 在NocoBase中&#xff0c;collection&#xff08;集合&#xff09;是用来组织和存储各种数据的容器&#xff0c;如订单、产品、用户、评论…

VMware中的虚拟机设置开启VT虚拟化

虚拟机系统关机打开虚拟机设置-----点击处理器----勾选虚拟化引擎---确定即可

【UML】-01-UML基本元素的介绍

1、UML的词汇表 &#xff08;1&#xff09;事物&#xff1b; &#xff08;2&#xff09;关系&#xff1b; &#xff08;3&#xff09;图。 事物是对模型中首要成分的抽象&#xff1b;关系把事物结合在一起&#xff1b;图聚集了相关的事物。 注&#xff1a;事物也称为元素 2…

Springboot项目——网页版本五子棋

网页五子棋&#xff1a;本项目简单实现了网页版本的五子棋对战功能&#xff0c;同时会根据用户的天梯分数来匹配&#xff0c;可供多位用户同时提供对战功能。大致可分为三个模块&#xff0c;用户模块&#xff0c;匹配模块&#xff0c;对战模块&#xff0c;下面重点介绍以下三个…

交叉熵损失函数计算过程(tensorflow)

交叉熵损失函数通常用于多类分类损失函数计算。计算公式如下&#xff1a; P为真实值&#xff0c;Q为预测值。 使用tensorflow计算 import tensorflow as tf import keras# 创建一个示例数据集 # 假设有3个样本&#xff0c;每个样本有4个特征&#xff0c;共2个类别 # 目标标签…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做&#xff1f;《简爱》作为夏洛蒂勃朗特的代表作&#xff0c;不仅是一部经典的爱情小说&#xff0c;也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品&#xff0c;制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

excel数据丢失怎么办?表格文件恢复的3个方法

Excel作为一个常用的表格文件&#xff0c;我们在工作中经常都需要用到它。最令人崩溃的事就是有时候我们辛辛苦苦用Excel完成了工作&#xff0c;但是突然发现Excel数据丢失。这可怎么办呢&#xff1f;如何找回丢失的Excel数据&#xff1f;下面小编就分享几种恢复办法。 方法一&…

抖音 v27.8.0 内置增强模块,自动播放、无水印下载(可登录,助手增强版)

介绍 抖音应用作为全球领先的短视频平台&#xff0c;其内置功能允许用户将喜欢的内容保存至本地设备&#xff0c;但默认情况下&#xff0c;这些视频会带有抖音的水印。为了解决这一限制&#xff0c;该版本使用户能够直接保存不带水印的视频到手机中&#xff0c;无需使用任何第…

TikTok电商带货特训营,跟随时代潮流,跨境掘金(8节课)

课程内容&#xff1a; 1-先导课 2-一、店铺运营认知与思路 3-二、店铺风控注意事项 4-三、美区Tiktok前期工作-1店铺入驻模式 5-三、美区Tiktok前期工作-2指纹浏览器介绍 6-三、美区Tiktok前期工作-4绑定电话号码 7-三、美区Tiktok前期工作-5添加仓库地址 8-三、美区Ti…

央视网视频下载和花屏问题处理

央视网(www.cctv.com)视频下载往往是花屏的&#xff0c;如何处理呢&#xff1f; 如果您是IT技术开发者&#xff0c;那么您可以通过下面步骤自己实现。 用chrome浏览器&#xff0c;F2打开开发者工具&#xff0c;找到当前页面的network 然后找一个接口&#xff1a;https://vdn.a…

JRebel 激活及使用

插件下载 JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace 从磁盘安装下载的插件 windows下载激活服务 Releases ilanyu/ReverseProxy GitHub mac没有对应版本&#xff0c;需要Docker搭建本地激活服务 docker pull qierkang/golang-reverseproxy docker run -d -…

(2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch

Eagle and Finch: RWKV withMatrix-Valued States and Dynamic Recurrence 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. Eagle/Finch 架构 4. 方法 4.1 Eagle 4.1.1 Eagle…

基于Pytorch框架的深度学习RegNet神经网络二十五种宝石识别分类系统源码

第一步&#xff1a;准备数据 25种宝石数据&#xff0c;总共800张&#xff1a; { "0": "Alexandrite","1": "Almandine","2": "Benitoite","3": "Beryl Golden","4": "Carne…

ctfshow web入门 黑盒测试

web380 这里文章看的我好有感触 但是影响做题 扫描一下 访问flag.php啥也没有再访问page.php page.php?idflagweb381 扫出来page.php但是没啥用哇&#xff0c;查看源代码 这些文件挨个试发现啥也没&#xff0c;最后仔细对比发现其实都是layui&#xff0c;然后尝试着访问…