什么是 APM?
利用应用程序性能监测,您可以查看应用程序将时间花在哪些地方、在执行哪些操作、在调用哪些其他应用程序或服务,以及遇到了哪些错误或异常情况。
通过 APM,还可以了解关键性能指标的历史记录和趋势,比如延迟和吞吐量,以及事务和依赖信息:
逻辑架构
Elastic APM 依赖于 APM 服务器,后者会将应用程序跟踪和指标数据从安装有 APM 代理的应用程序转发到 Elastic 可观测性集群。Elastic APM 支持多种不同的代理类型:
原生 Elastic APM 代理,支持多种语言,包括 Java、.NET、Go、Ruby、Python、Node.js、PHP 和客户端 JavaScript
已装载 OpenTelemetry 测量工具的代码
已装载 OpenTracing 测量工具的代码
已装载 Jaeger 测量工具的代码
设置 APM 服务器
APM 服务器将跟踪和应用程序指标数据从 APM 代理转发到 Elasticsearch。要将 APM 数据添加到 Elastic 可观测性集群,我们可以按照 Kibana 本身提供的简要说明进行操作。在 Kibana 中在确认 Elasticsearch 和 Kibana 正在运行后,连接到 Kibana 实例。例子是ansible 安装部署tomcat。
1.下载 APM服务器,将 APM 服务器连接到 Elasticsearch
1、playbook
---
- hosts: exporter_node //定义部署的主机类型
become: yes
become_method: sudo
become_user: root //提升至root权限
roles: //指定执行哪个roles
- role: apm-server
vars: //变量定义
# Apm_server 版本
apm_version: "7.14.2"
# 自定义secret_token 需要同apm-agent对应
apm_secret_token: ""
# ES主机IP:Port
elastic_hosts: ""
# ES 用户名
elastic_username: "elastic"
# ES 密码
elastic_password: "XXXXXXXXXXXXX"
2、roles
在roles文件中包含:
Defaults:默认变量会放在defaults目录下的main.yml
Files:存放安装包
Hanlders:编写一些触发任务,例如重启
Tasks:执行的任务,具体的执行逻辑
Tempaltes:存放模板,例如服务文件,配置文件
Vars: 存放变量优先级大于vars
Tasks目录下的
Main.yml:调用其他任务模块
---
- name: install_apm //安装apm
include_tasks: install_apm.yml
- name: make dictionary //创建目录
include_tasks: mkdir.yml
- name: copy certs //复制证书
include_tasks: copy_certs.yml
- name: replace apm-server.yml //替换apm-server.yml文件
include_tasks: replace.yml
install_apm.yml:
---
- name: download apm server //下载rpm安装包
become: true
get_url:
url: "http://xxxx/elk/{{apm_version}}/apm-server-{{apm_version}}-x86_64.rpm"
dest: "/tmp/apm-server-{{apm_version}}-x86_64.rpm"
mode: '0644'
register: _down_apm
until: _down_apm is succeeded
retries: 5
delay: 2
# remote_src: yes
check_mode: false
- name: install rpm //进行安装
yum:
name: "/tmp/apm-server-{{apm_version}}-x86_64.rpm"
state: present
mkdir.yml:创建目录并赋予对应的权限
---
- name: Creates directory
file:
path: /etc/apm-server/cert
state: directory
owner: root
group: root
mode: 0755
copy_certs.yml:因为开启认证所以需要证书,将证书和key复制到对应位置
---
- name: copy certs
copy:
src: apmserver.crt
dest: /etc/apm-server/cert
owner: root
group: root
- name: copy key
copy:
src: apmserver.key
dest: /etc/apm-server/cert
owner: root
group: root
replace.yml:替换apm-server.yml文件,重新启动
---
- name: replace apm-server.yml
template:
src: apm-server.yml.j2
dest: /etc/apm-server/apm-server.yml
owner: root
group: root
mode: 0755
notify: restart the service
templates目录下的service文件:
apm-server:
host: "0.0.0.0:8200"
rum:
enabled: true
kibana:
enabled: true
host: "xxxxx:5601"
username: "elastic"
password: "{{elastic_password}}"
apm-server.ssl.enabled: true
apm-server.ssl.certificate: "/etc/apm-server/cert/apmserver.crt"
apm-server.ssl.key: "/etc/apm-server/cert/apmserver.key"
apm-server.auth.secret_token: "{{apm_secret_token}}"
apm-server.auth.api_key.enabled: true
output.elasticsearch:
hosts: "{{elastic_hosts}}"
protocol: "https"
username: "{{elastic_username}}"
password: "{{elastic_password}}"
ssl.enabled: true
ssl.verification_mode: none
2.将代理连接到 APM 服务器
首先确认hosts参数,使用ansible在exporter_node类别进行批量部署
hosts: exporter_node
升级权限,将权限提升到root
become: yes
become_method: sudo
become_user: root
执行apm-agent-tomcat剧本
roles:
- role: apm-agent-tomcat
定义变量,一般为了确保可用性,会将频繁变动的参数的变量写入其中
vars:
# 需要将下载的apm-agent包放置到tomcat的lib目录下
tomcat_lib_dir: "/home/app02/tomcat3/apache-tomcat-9.0.56/lib"
# 将apm-agent的配置写入该文件中
setenv: "/home/app02/tomcat3/apache-tomcat-9.0.56/bin/setenv.sh"
# apm-agent jar包的版本
version: "1.28.0"
# 自定义apm service名称
service_name: "tomcat-test"
# apm server地址 端口
apm_server_url: "https://XXXXX:8200"
# 自定义token
secret_token: "XXXXXXX"
# tomcat的bin目录
tomcat_bin_dir: "/home/app02/tomcat3/apache-tomcat-9.0.56/bin"
# 自定义apm环境名称
apm_environment: "production"
2、Ansible Roles说明
在roles目录下有apm-agent-tomcat的完整的执行逻辑
Defaults文件里是默认变量 ,一般变量的优先级是playbook>vars>defaults
如果前面两个文件中没有变量,则defaults文件的默认值则会带入
变量将会写在main.yml
Tasks文件中是执行的任务
在main.yml文件中进行任务的调用,首先执行download_tar_ball.yml下载软件包并进行安装,然后执行create_file.yml进行创建文件,如果没有setenv.sh文件则创建它,最后在setenv.sh加入配置,并启动进行apm agent进行服务的监控
Download_tar_ball.yml
---
- name: download //任务名字
become: true //升权限
get_url: //获取下载包
url: "http://XXXXX/elk/apm-agent/elastic-apm-agent-{{ apm_version }}.jar"
//下载地址
#url: "http://XXXX/elk/apm-agent/elastic-apm-agent-1.28.0.jar"
dest: "{{ apm_path }}" //下载包的存放路径
mode: '0644' //权限
owner: "{{ apm_agent_tomcat_user }}" //指定用户角色
group: "{{ apm_agent_tomcat_group }}" //指定组别
register: _download_apm_agent //注册下载任务
until: _download_apm_agent is succeeded //确定下载成功
retries: 5 //重试
delay: 2
check_mode: false
create_file.yml
---
- name: create apm-setenv.sh //任务名称
file:
path: "{{ apm_setenv }}" //文件创建路径
state: touch //如果文件存在则更新,文件不存在则创建
owner: "{{ apm_agent_tomcat_user }}" //确定用户
group: "{{ apm_agent_tomcat_group }}" //确定组
mode: 755 //赋予权限
add_config.yml
---
- name: add //任务名
blockinfile: //追加模块
path: "{{ apm_setenv }}" //文件路径
create: true
marker: "#{mark} Elastic Apm Config Block"
block: | //如下是追加内容
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH
Export CATALINA_OPTS="$CATALINA_OPTS -javaagent:{{ apm_path }}/elastic-apm-agent-{{ apm_version }}.jar"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.service_name={{ apm_service_name }}"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.application_packages={{ apm_app_packages }}"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.server_url={{ apm_server_url }}"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.secret_token={{ apm_secret_token }}"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.verify_server_cert=false"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.environment={{ apm_environment }}"