Elastic 可观测性小练习

视频链接:https://cloud.tencent.com/developer/salon/live-1443
ppt链接:https://docs.qq.com/slide/DUGRzYVVTU3ZxblBP
操作文档链接:https://elastic.martinliu.cn/codelabs/elastic-observability-foundation-qq

目的

可观测性是目前云原生里面比较火的概念,从最初我们学习开发从主机模式着手到基于 C/S 架构的开发模式,接着是从 J2EE 到现在的微服务和基于容器的服务,以及目前比较热门的基于流程编排的开发架构。但我们发现虽然开发、迭代、交付的效率得到了很大的提升系统或者应用变得复杂。

而可观察性是一套理念系统,没有对技术的具体要求。其重点是团队要融入可观察性的理念,特别是要求研发写出的应用是可观察的。将可观察性包含在你的需求之中,它是与扩展性,可用性同等重要的非业务性需求。

Apple 的工程师 Cindy Sridharan 的博文“监控与观察”(Monitoring and Oberservability)首次将 Oberservability 一次带入开发者的视野。

引用一下 Baron SchSchwarz 大咖的一个定义:“监控告诉我们系统的哪些部分是工作的。可观测性告诉我们那里为什么不工作了。”这句话即定义了可观测性,也告诉了我们可观测性和传统的监控的区别。Elastic 可观测性小练习

对公司的运维团队来说,比较尴尬的是当监控系统显示状态为“绿色”的情况下,我们的客服系统却被打爆了。业务部门的同事也来向你投诉,业务系统已经不能正常工作了。另外一种情况就是你自己也已经发现监控系统已经爆红了,监控系统也没办法告诉你到底是哪里不工作了,以及为何不工作了。

为了解决这样的窘境呢,我们希望能站在应用系统本身出发去探讨另外一个概念或者特性——应用系统的可观测性。尤其是最前面提到的在当今云原生时代下的应用系统的可观测性。

我们用 Elastic Stack 技术栈练习下可观测性构建的方法,Elastic可观测性主要有三个部分组成:Elastic 可观测性小练习

构建云原生可观测性步骤

第一步是应用服务的健康检查
第二步是做应用服务的指标分析
第三步是日志收集
第四部是做apm应用追踪
Elastic 可观测性小练习

环境准备

腾讯云 轻量级服务器
腾讯云 ES集群

确保CentOS 虚拟机可以正常访问 ES 集群所在网段,所有端口可达
因为腾讯刚好有免费体验的活动想薅腾讯爸爸的羊毛,分别创建了两个服务,因为是对应不同的vpc我又建立了对等连接(network connnect),建好后结果还是连不上。因为免费,所在的区、vps都无法自己指定。最后把es服务开了公网并把CentOS 虚拟机的ip添加到es的白名单。

  • 在服务器查看能否访问es
curl -XGET -u 'elastic:Elastic@1234#'    https://es-e7r3xccy.public.tencentelasticsearch.com:9200

Elastic 可观测性小练习

  • 设置集群索引刷盘数据可见的时间为1s
PUT _all/_settings
  {
    "refresh_interval": "1s"
  }
  • 我们的node应用程序环境基础配置
yum install -y java-11-openjdk.x86_64 nodejs git nginx

tips 1: 如果提示没有可用软件包 nodejs,只能wget 安装包了,具体做法如下:

yum install -y wget

wget https://nodejs.org/dist/v12.18.1/node-v12.18.1-linux-x64.tar.xz

tar -xvf node-v12.18.1-linux-x64.tar.xz

ln -s /root/elastic-labs-qq/petclinic/frontend/node-v12.18.1-linux-x64/bin/node /usr/bin/node
ln -s   /root/elastic-labs-qq/petclinic/frontend/node-v12.18.1-linux-x64/bin/npm /usr/bin/npm 

node -v

npm -v

tips 2: 如果提示 没有可用软件包 nginx。

 sudo yum install epel-release
yum install -y nginx

  • 下载示例代码
git clone https://gitee.com/devopscoach/elastic-labs-qq.git
cd elastic-labs-qq
cd petclinic/frontend/
npm install

这样服务就启动了

健康检查

我们的各种业务服务当前的状态是否可用、能否处理更多的工作量(可用性和饱和度)。好的健康检查会提供service name、is health、work load是高是低、以及apm服务依赖。如下:Elastic 可观测性小练习
在Elastic stack中提供heartbeat的健康检查工具,heatbeat可以针对网络应用层不同的协议做不同的探针,我们需要针对internal service(内网对客户屏蔽的)和 external service的做不同的健康检查。Elastic 可观测性小练习
这里演示heartbeat监控kibana service服务:

  • 安装 Heartbeat 及探针服务
    yum install -y https://mirrors.cloud.tencent.com/elasticstack/7.x/yum/7.10.1/heartbeat-7.10.1-x86_64.rpm
    

进入 heartbeat 的配置文件目录中,cd /etc/heartbeat/。heartbeat .yml可以设置对monitor.d检测的周期。
Elastic 可观测性小练习

  • 编辑主配置文件
# 在这里设置对monitor。d检测的路径,检测加载周期时间等
heartbeat.config.monitors:
  path: ${path.config}/monitors.d/*.yml
  reload.enabled: true
  reload.period: 5s
# 其实应该在monitor。d中进行配置,这里图方便在这里配置
heartbeat.monitors:
- type: http
  id: my-monitor
  name: my-kibana-service
  urls: ["http://hadoop01:5601/"]
  schedule: '@every 5s'
setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression
setup.kibana:
output.elasticsearch:
  hosts: ["192.168.2.2:9200"]
#如果是外网探测的话最好输入下地址位置坐标,因为我后来是本地测试的 不需要地理位置信息
# processors:
#  - add_observer_metadata:
   #   geo:
      #  name: China-SZ
      #  location: "120.6199071,31.3179873"
  • 初始化和运行 Heartbeat 服务
# test 命令是检查配置文件的语法和与 Elasticsearch 服务的连接和认证是否正常
heartbeat test config
heartbeat test output

#setup 的作用是初始化 Heartbeat 的索引,导入相关的数据管理策略
heartbeat setup

# 运行heatbeat,本案例主要是检测kibana服务的健康状况
heartbeat -e

Elastic 可观测性小练习

在 Kibana 中查看 Uptime app 中的数据

我们先打开kibana,点击obserbility的菜单
或者直接点击uptime子菜单,可以看到Elastic 可观测性小练习点击my-kibana-service可以看到更细粒度的监控。
查看目前的服务部署点:Elastic 可观测性小练习
如果你的集群是白金版的Liscense,我们可以使用机器学习做一些单指标异常分析,因为通常我们的指标非常多、设定告警阈值比较麻烦,使用机器学习的功能可以替代设定单一告警:Elastic 可观测性小练习
Elastic 可观测性小练习
这个时候我们点开机器学习的界面,发现有一个job在运行了:Elastic 可观测性小练习
至此,heatbeat的准备工作完成。最后在命令行里按 ctrl + c 终止 ‘heartbeat -e’ 命令。然后运行一下命令,后台启动 heartbeat 服务。


systemctl start heartbeat-elastic.service
systemctl enable  heartbeat-elastic.service 
systemctl status  heartbeat-elastic.service 
指标采集

指标是在连续的时间周期里度量的KPI数值,
监控指标的三种类型、来源:
Elastic 可观测性小练习

其中,系统指标就是部署服务的主机等物理指标;应用指标比如一些消息中间件Kafka RocketMQ之类的吞吐、时延等指标;业务指标是最能反应业务系统正常的指标,通常有两种做法:1.通过监控工具厂商提供的外挂的接口,写一段往外吐指标的功能比如promethus的exporter 2.感兴趣的可以研究下CNCF的OpenTelemetry项目。

一般的指标监控部署如下,针对beats在不同AZ、不同网段采集信息,logstash起到了汇聚和转发的作用。
Elastic 可观测性小练习

  • 安装 Metricbeat

    yum install -y https://mirrors.cloud.tencent.com/elasticstack/7.x/yum/7.10.1/metricbeat-7.10.1-x86_64.rpm
    

    进入 Metricbeat 的配置文件目录cd /etc/metricbeat/,查看 Metricbeat 的配置目录Elastic 可观测性小练习

  • 使用setup初始化Metricbeat 服务

metricbeat setup -e   --index-management   --dashboards \
 -E output.elasticsearch.hosts=['192.168.2.2:9200']   \
 -E output.elasticsearch.username=elastic   \
 -E output.elasticsearch.password=Elastic@1234#   \
 -E setup.kibana.host=hadoop03:5601
  • 配置基础配置文件Metricbeats , 我们先来熟悉下原始文件构造
#=========================== Modules configuration ============================
# 我们不想频繁地重启metricbeat服务,因此在修改完配置文件时候,该模块负责刷新和重新加载
metricbeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s

#=========================== Elasticsearch output =============================
output.elasticsearch:
  hosts: ["172.21.16.16:9200"]
  username: "elastic"
  password: "Elastic@1234#"

#=============================== Processors ===================================
processors:
  - add_host_metadata: 
      netinfo.enabled: true
      cache.ttl: 5m
      geo:
        name: bj-dc-01
        location: 35.5528, 116.2360
        continent_name: Asia
        country_iso_code: CN
        region_name: Beijing
        region_iso_code: CN-BJ
        city_name: Beijing 
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  - add_fields:
      target: ''
      fields:
        service.name: 'Pet Clinic'
        service.id: 'petclinic-vm'

#==================== Best Practice Configuration ==========================
setup.ilm.check_exists: false
logging.level: error
queue.spool: ~
monitoring.enabled: true

个别参数解释:
output.elasticsearch 部分配置了,Elasticsearch 集群的内网访问地址,elastic 的账户密码
netinfo.enabled: true 收集所有网卡的配置信息
service.name 和 service.id 设定运行在本操作系统上的应用系统的名字,用于丰富每一个指标采集点的元数据
setup.ilm.check_exists: false 禁用索引 ilm 策略检查,避免无用动作
logging.level: error 把Beats自身的日志记录调到最低级别降低
queue.spool: ~ 开启本地默认的端点缓存行为
在这个配置文件中的 Elasticsearch 部分使用了管理员账户信息,生产上不推荐这么做,可以将其替换为密码形式配置

  • 测试配置文件是否语法正确。
metricbeat test config
metricbeat test output

systemctl enable  metricbeat
systemctl start  metricbeat
systemctl status  metricbeat

在提示 OK 的情况下,启用并开启 metricbeat 的后台指标采集服务。

  • 查看仪表板
    Metricbeat 采集代理程序默认会启用操作系统指标采集的模块,setup 命令会一次性的将所有 Metricbeat 预制的上百种仪表板加载到后台,供 Kibana 浏览和搜索指标数据使用。

打开 Kibana 界面
打开左侧菜单栏,点击 ‘Dashboard’ 选项
在页面的搜索框中输入 system 后,查看 Metricbeat 自带的仪表板,它们是 setup 命令导入的。
点击查看名为 “[Metricbeat System] Overview ECS” 的仪表板。
在 System Overview 和 Host Overview 的两个视图中切换查看

Elastic 可观测性小练习
Elastic 可观测性小练习

System Overview 是当前所有被监控系统的指标统计汇总
Host Overview 是某一个操作系统的监控指标展示

启用 Nginx 监控模块

启动nginx:
systemctl start nginx
查看状态:
systemctl status nginx
外网访问nginx地址Elastic 可观测性小练习
Metricbeat 默认采集系统的指标。我们之前在这个服务器上安装了 Nginx,下面启用 Metricbeat 对 Nginx 的监控模块。

metricbeat modules enable nginx
metricbeat modules list

Elastic 可观测性小练习
首先,需要修改 Nginx 服务器的配置文件,启用 Nginx 的 ngx_http_stub_status 模块。 编辑 /etc/nginx/nginx.conf 文件,在 Server 段落中增加以下内容。

location /server-status {
            stub_status on;
            access_log off;
        }

修改好之后,重启 Nginx 服务,并测试验证该模块是否已经启用。

systemctl restart nginx
curl localhost/server-status

其次,查看一下 Metricbeat 的 nginx 的配置文件,并不需要做任何修改。

cat /etc/metricbeat/modules.d/nginx.yml

这个时候我们返回kibana查看obserbility就可以看到metric指标了Elastic 可观测性小练习
Elastic 可观测性小练习

我们也可以去nginx dashboard查看Elastic 可观测性小练习
Elastic 可观测性小练习

日志

通俗地讲,日志告诉我们何时何地发生了什么事情。Elastic 可观测性小练习

通常来说日志有些是机器生成的,有些的app生成的。如果机器生成的日志,比如操作系统、中间件、消息队列、数据库等都是属于行业规则文件,不需要做解析市面的监控工具都已经集成了。但app的日志需要进行进一步的解析。
请求型日志:Elastic 可观测性小练习
排错日志:Elastic 可观测性小练习
所以好的日志系统要满足以下三点:
Elastic 可观测性小练习
可关联性就是使用一个traceID讲不同来源的数据关联起来:Elastic 可观测性小练习

  • 安装 Filebeat
yum install -y https://mirrors.tencent.com/elasticstack/7.x/yum/7.10.1/filebeat-7.10.1-x86_64.rpm
  • 初始化 Filebeat 服务
    setup 命令会初始化相关索引和配套的管理策略 , 这个步骤可能会持续 2~3 分钟。
filebeat setup -e   --index-management   --dashboards \
  -E output.elasticsearch.hosts=['192.168.2.2:9200']   \
  -E setup.kibana.host=192.168.2.2:5601

加载完kibana的dashboard会发现很多模版.
然后,我们点击stack management—》ilm 对索引做生命周期的修改Elastic 可观测性小练习
索引有hot 、warm、cold phase,我们需要设置delete phase,假设我们超过十天的索引就不用。Elastic 可观测性小练习

  • 编辑主配置文件
    查看默认的主配置文件 filebeat.yml
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/*.log

#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 60s

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  hosts: ["172.21.16.16:9200"]
  username: "elastic"
  password: "Elastic@1234#"

#================================ Processors =====================================
processors:
  - add_host_metadata: 
      netinfo.enabled: true
      cache.ttl: 5m
      geo:
        name: bj-dc-01
        location: 35.5528, 116.2360
        continent_name: Asia
        country_iso_code: CN
        region_name: Beijing
        region_iso_code: CN-BJ
        city_name: Beijing 
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  - add_fields:
      target: ''
      fields:
        service.name: 'Pet Clinic'
        service.id: 'petclinic-vm'

#==================== Best Practice Configuration ==========================
setup.ilm.check_exists: false
logging.level: error
queue.spool: ~
monitoring.enabled: true

netinfo.enabled: true 收集所有网卡的配置信息
service.name 和 service.id 是运行在本操作系统上的应用系统的名字

  • 测试配置文件是否语法正确。在提示 OK 的情况下,启用并开启 filebeat 的日志采集服务。
filebeat test config
filebeat test output
filebeat -e

Elastic 可观测性小练习

如果以上命令不报错的话,继续下面的步骤启用 Filebeat 模块和启动 Filebeat 服务。

Filebeat 的 processors 处理器机制可以实现丰富的日志字段丰富和处理,基于 Elastic ECS 通用数据定义的日志元数据丰富在本课程中不作讲解。请大家课后深入学习。另外应用程序和日志采集工具的配合也不在此做深入讨论,请开发者在设计程序的日志输出机制时,同时考虑到后期的日志采集工具。
在配置文件的最后一行添加monitor.enable:true 我们不想看数据,只想看monitor在不在正常工作—》到kibana,stack monitoring --> 在cluster listing选择集群—>查看beats状态

  • 初始化和运行filebeat

启用 Filebeat 的系统日志采集和 Nginx 服务日志采集。

filebeat  modules enable system nginx

Elastic 可观测性小练习

systemctl enable  filebeat
systemctl start  filebeat
systemctl status  filebeat

Elastic 可观测性小练习
我们可以到discover里面查看filebeat*是否有数据

Elastic 可观测性小练习
我们再次回到可观测性界面:
Elastic 可观测性小练习

  • 查看 Filebeat 相关仪表板
    打开 Kibana 界面
    打开左侧菜单栏,点击 ‘Dashboard’ 选项
    在页面的搜索框中输入 system 后,查看 Filebeat 自带的仪表板,它们是 setup 命令导入的。
    点击查看名为 “[Filebeat System] Syslog dashboard ECS” 的仪表板。

Elastic 可观测性小练习

APM

日志不报错、指标不报错Elastic 可观测性小练习

APM多了apm-server组件,apm-server是聚合服务器Elastic 可观测性小练习
Elastic 可观测性小练习

  • 安装 APM 服务器
yum install -y https://mirrors.cloud.tencent.com/elasticstack/7.x/yum/7.10.1/apm-server-7.10.1-x86_64.rpm
cd /etc/apm-server/
  • 在 APM 服务器的配置目录中,查看主配置文件 apm-server.yml 的默认内容,确保其中的内容至少包含以下内容。
apm-server:
  host: "0.0.0.0:8200"
  rum:
    enabled: true
output.elasticsearch:
  hosts: ["172.21.16.16:9200"]
  username: "elastic"
  password: "Elastic@1234#"
  • 在命令行下初始化 APM 服务器
apm-server test config
apm-server test output

Elastic 可观测性小练习

apm-server setup
apm-server -e
  • 在kibana上查看apmElastic 可观测性小练习

  • 观察服务的日志,在没有报错的情况下,启动 apm-server 后台服务。

chown apm-server:apm-server /var/lib/apm-server/meta.json
chown apm-server:apm-server /etc/apm-server/apm-server.yml
chmod 0600 /etc/apm-server/apm-server.yml
systemctl start  apm-server
systemctl enable  apm-server
systemctl status  apm-server

Elastic 可观测性小练习

运行宠物诊所演示程序

  • 启动宠物诊所后台的核心应用服务,并且同时挂载 javaagent 代理。
java -javaagent:elastic-apm-agent-1.18.1.jar -Delastic.apm.service_name=petclinic-spring -Delastic.apm.server_urls=http://localhost:8200 -jar spring-petclinic-1.5.16.jar

  • cd /root/elastic-labs-qq/petclinic/frontend, 编辑config.js文件
  • 启动node js应用 npm start
    Elastic 可观测性小练习
    Elastic 可观测性小练习
  • 我们在这个宠物平台随便操作一下(方便产生apm埋点数据),再次进入kibana查看apm数据
    Elastic 可观测性小练习

配置 Nginx 为宠物诊所的反向代理

让 Nginx 代理所有 80 端口的访问到 node.js 访问的 4000 端口上。

修改 nginx.conf 配置文件,在 location 这个段落中增加一行。

location / {
            proxy_pass http://localhost:4000;
        }

Elastic 可观测性小练习

重启nginx

公网 IP 地址。例如:http://188.131.151.204/ 。你将依然能够正常访问宠物诊所应用的所有页面。

最后,增加宠物诊所应用系统的健康检查探针。这里详细看操作手册

上一篇:IDEA--代码带入码云Gitee


下一篇:aliyun - 云企业网