什么是 APM?
利用應用程序性能監(jiān)測,您可以查看應用程序將時間花在哪些地方、在執(zhí)行哪些操作、在調用哪些其他應用程序或服務,以及遇到了哪些錯誤或異常情況。
通過 APM,還可以了解關鍵性能指標的歷史記錄和趨勢,比如延遲和吞吐量,以及事務和依賴信息:
邏輯架構
Elastic APM 依賴于 APM 服務器,后者會將應用程序跟蹤和指標數據從安裝有 APM 代理的應用程序轉發(fā)到 Elastic 可觀測性集群。Elastic APM 支持多種不同的代理類型:
原生 Elastic APM 代理,支持多種語言,包括 Java、.NET、Go、Ruby、Python、Node.js、PHP 和客戶端 JavaScript
已裝載 OpenTelemetry 測量工具的代碼
已裝載 OpenTracing 測量工具的代碼
已裝載 Jaeger 測量工具的代碼
設置 APM 服務器
APM 服務器將跟蹤和應用程序指標數據從 APM 代理轉發(fā)到 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: //指定執(zhí)行哪個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:編寫一些觸發(fā)任務,例如重啟
Tasks:執(zhí)行的任務,具體的執(zhí)行邏輯
Tempaltes:存放模板,例如服務文件,配置文件
Vars: 存放變量優(yōu)先級大于vars
Tasks目錄下的
Main.yml:調用其他任務模塊
---
- name: install_apm //安裝apm
include_tasks: install_apm.yml
- name: make dictionary //創(chuàng)建目錄
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:創(chuàng)建目錄并賦予對應的權限
---
- 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
執(zhí)行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環(huán)境名稱
apm_environment: "production"
2、Ansible Roles說明
在roles目錄下有apm-agent-tomcat的完整的執(zhí)行邏輯
Defaults文件里是默認變量 ,一般變量的優(yōu)先級是playbook>vars>defaults
如果前面兩個文件中沒有變量,則defaults文件的默認值則會帶入
變量將會寫在main.yml
Tasks文件中是執(zhí)行的任務
在main.yml文件中進行任務的調用,首先執(zhí)行download_tar_ball.yml下載軟件包并進行安裝,然后執(zhí)行create_file.yml進行創(chuàng)建文件,如果沒有setenv.sh文件則創(chuàng)建它,最后在setenv.sh加入配置,并啟動進行apm agent進行服務的監(jiān)控
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 }}" //文件創(chuàng)建路徑
state: touch //如果文件存在則更新,文件不存在則創(chuàng)建
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 }}"