Elastic APM安裝教程
一、 CentOS設置
1. 更換阿里源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
2. 安裝網絡工具
yum install net-tools wget -y
3. 使用阿里NTP服務
yum install chrony -y
sed -i "/server/d" /etc/chrony.conf
vi /etc/chrony.conf 增加 server ntp.aliyun.com iburst
systemctl restart chronyd
chronyc tracking
4. 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
5. 禁用Selinux
vi /etc/selinux/config
SELINUX=disabled
6. 關閉swap和禁用交換
swapoff -a
sudo sysctl vm.swappiness=0
vi /etc/fstab #注釋掉swap這行
vi /etc/sysctl.conf 添加如下
vm.swappiness = 0
論證是否生效
sudo sysctl vm.swappiness
7. 增加文件描述符
vi /etc/security/limits.conf 添加如下
* soft nofile 65536
* hard nofile 65536
8. 設置映射上限
sysctl -w vm.max_map_count=262144
vi /etc/sysctl.conf
vm.max_map_count=262144
sysctl vm.max_map_count
二、 安裝Docker
1. 安裝依賴包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2. 設置倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3. 安裝Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
如果下載速度過慢可以利用本地離線安裝:
cd /home
wget ftp://ftp.vip56.cn:88/software/docker/containerd.io-1.2.13-3.1.el7.x86_64.rpm ftp://ftp.vip56.cn:88/software/docker/docker-ce-19.03.8-3.el7.x86_64.rpm ftp://ftp.vip56.cn:88/software/docker/docker-ce-cli-19.03.8-3.el7.x86_64.rpm
sudo yum localinstall -y containerd.io-1.2.13-3.1.el7.x86_64.rpm docker-ce-19.03.8-3.el7.x86_64.rpm docker-ce-cli-19.03.8-3.el7.x86_64.rpm
4. 啟動並設置開機
sudo systemctl start docker
sudo systemctl enable docker
5. 設置加速器
vi /etc/docker/daemon.json 添加如下內容
{
"registry-mirrors": ["https://harbor.vip56.cn"]
}
sudo systemctl restart docker
三、 安裝Docker-Compoise
1. 下載安裝包
sudo curl -L ftp://ftp.vip56.cn:88/software/docker/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
2. 設置啟動權限
sudo chmod +x /usr/local/bin/docker-compose
四、 安裝ElasticSearch與Kibana
1. 下載鏡像包
docker pull harbor.vip56.cn/common/elasticsearch:7.8.0
docker pull harbor.vip56.cn/common/kibana:7.8.0
2. 編寫服務腳本
這里服務我們將采用Docker Compose
進行部署。
version: '2.2'
services:
es01:
image: harbor.vip56.cn/common/elasticsearch:7.8.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: harbor.vip56.cn/common/elasticsearch:7.8.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- elastic
es03:
image: harbor.vip56.cn/common/elasticsearch:7.8.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
ports:
- 9202:9200
networks:
- elastic
kib01:
image: harbor.vip56.cn/common/kibana:7.8.0
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
啟動服務docker-compose up
五、 安裝apm-server服務
1. 下載鏡像
docker pull harbor.vip56.cn/common/apm-server:7.0.1
2. 編寫配置文件
apm-server:
host: "0.0.0.0:8200"
#queue:
#mem:
# Max number of events the queue can buffer.
#events: 4096
#setup.template.pattern: "apm-%{[observer.version]}-*"
#setup.template.overwrite: false
#setup.template.settings:
#index:
#number_of_shards: 1
#codec: best_compression
#number_of_routing_shards: 30
#mapping.total_fields.limit: 2000
output.elasticsearch:
hosts: ["192.168.153.154:9200"]
# Number of workers per Elasticsearch host.
#worker: 1
indices:
- index: "apm-%{[observer.version]}-sourcemap"
when.contains:
processor.event: "sourcemap"
- index: "apm-%{[observer.version]}-error-%{+yyyy.MM.dd}"
when.contains:
processor.event: "error"
- index: "apm-%{[observer.version]}-transaction-%{+yyyy.MM.dd}"
when.contains:
processor.event: "transaction"
- index: "apm-%{[observer.version]}-span-%{+yyyy.MM.dd}"
when.contains:
processor.event: "span"
- index: "apm-%{[observer.version]}-metric-%{+yyyy.MM.dd}"
when.contains:
processor.event: "metric"
- index: "apm-%{[observer.version]}-onboarding-%{+yyyy.MM.dd}"
when.contains:
processor.event: "onboarding"
#max_retries: 3
#bulk_max_size: 50
#backoff.max: 60s
#timeout: 90
#logging.level: info
#logging.to_syslog: true
#logging.metrics.enabled: false
#logging.metrics.period: 30s
#logging.to_files: true
#logging.files:
#path: /var/log/apm-server
#name: apm-server
#rotateeverybytes: 10485760 # = 10MB
#keepfiles: 7
#permissions: 0600
#interval: 0
#logging.json: false
#http.enabled: false
#http.host: localhost
#http.port: 5066
2. 啟動服務
docker run -d --name=apm-server --user=apm-server --volume="$(pwd)/apm-server.yml:/usr/share/apm-serv
er/apm-server.yml:ro" -p 8200:8200 harbor.vip56.cn/common/apm-server:7.0.1
六、 各語言平台接入
1. .Net Core接入
新建一個ASP.NET CORE
項目,然后安裝Elastic.Apm.AspNetCore
包,並且在以下
方法中使用對應的初始化方法:
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseElasticApm(Configuration);
}
}
完成以上代碼初始化后,接着我們需要編寫對應的配置項以實現接入appsettings.json
:
"ElasticApm": {
"SecretToken": "",
"ServerUrls": "http://localhost:8200",
"ServiceName" : "MyApp",
}
2. .Net Core Api使用
上述的方式僅僅實現了采集常規的Http服務的請求,如果開發者還希望采集諸如由HttpClient
與ERCore
發出的請求則需要手動進行相關的注冊:
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseElasticApm(Configuration,
new HttpDiagnosticsSubscriber(),
new EfCoreDiagnosticsSubscriber());
}
}
除了以上提供的基於現有框架的度量指標采集外,我們還可以通過對應的API實現自主的度量指標
的記錄注入,比如下面這種方式:
var transaction = Elastic.Apm.Agent.Tracer.StartTransaction("MyTransaction", ApiConstants.TypeRequest);
transaction.Labels["system"] = "tmsystem";
transaction.Labels["group"] = "coregroup";
try
{
var span1 = transaction.StartSpan("from db", "Database");
Thread.Sleep(100);
var childspan1 = span1.StartSpan("from db2", "subspan");
Thread.Sleep(50);
childspan1.End();
span1.End();
}
catch(Exception ex)
{
transaction.CaptureException(ex);
throw;
}
finally
{
transaction.End();
}
有時因為需要調用其他方法,但是內部方法沒有transaction
對象,此時為了不破壞函數的入參
我們就需要利用var transaction = Elastic.Apm.Agent.Tracer.CurrentTransaction;
來
獲取對象,如果對象為NULL
則代表當前沒有創建過該對象,保證對應方法也能進行度量指標記錄。對應的還有子級SPAN
也可以通過var span = Elastic.Apm.Agent.Tracer.CurrentSpan;
方式獲取。
4. Java接入
首先我們需要在對應項目中引用具體框架,比如pom.xml
文件:
<dependency>
<groupId>co.elastic.apm</groupId>
<artifactId>apm-agent-attach</artifactId>
<version>1.17.0</version>
</dependency>
然后我們需要在項目的main
方法中進行初始化,比如下面我們就以Spring Boot
為例進行說明:
@RetrofitServiceScan
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ElasticApmAttacher.attach();
SpringApplication.run(Application.class, args);
}
}
接着編寫對應的配置文件elasticapm.properties
寫入如下內容:
service_name=my-cool-service
application_packages=com.logidelta.industrialbigdata
server_urls=http://192.168.153.155:8200
5. Java API使用
除了本身已經自帶的指標采集外,我們還可以通過對應的API實現自注指標的采集推送,首先我們
需要引入對應的庫才能實現,打開pom.xml
文件增加如下內容:
<dependency>
<groupId>co.elastic.apm</groupId>
<artifactId>apm-agent-api</artifactId>
<version>1.17.0</version>
</dependency>
完成以上的引入之后我們就可以使用Java API進行自定義指標的采集了,比如如下方式:
Transaction transaction = ElasticApm.currentTransaction();
try {
transaction.setName("DeviceController#Test");
transaction.setType(Transaction.TYPE_REQUEST);
transaction.addLabel("system", "tmsyste");
transaction.addLabel("group", "coregroup");
Span span1 = transaction.startSpan("from db", "mysql", "query");
span1.setName("select * from db");
span1.end();
} catch (Exception e) {
transaction.captureException(e);
throw e;
} finally {
transaction.end();
}
這里我們直接使用currentTransaction
方法,內部會自行實現對象的創建,所以可以不必檢查
是否為NULL
,對應的currentSpan
也是一樣的。
除了以上通過使用具體方法外,還可以通過注解屬性快速便攜的進行相關度量指標的采集,如
@CaptureTransaction
、@CaptureSpan
和@Traced
。