可能是全網首個支援阿里雲Elasticsearch Xapck鑑權的Skywalking
可能是全網首個支援阿里雲Elasticsearch Xapck鑑權的Skywalking
對Skywalking有興趣的同學參見:ofollow,noindex" target="_blank">年輕人的第一個APM-Skywalking
之前在搭建Skywalking的時候發現,官方Skywalking 5.X並支援有鑑權的Elasticsearch.
而我司有其他需求已經購買了阿里雲的Elasticsearch,諮詢過阿里雲技術支援後他們表示並不能去掉鑑權,所以只好自己想辦法了.
又在Skywalking技術群問了一圈,有其他人也遇到過類似的問題,但是最後還是選擇自建ES了.
實在不想自己再浪費精力去搭建ES了,還是覺得可以嘗試一下別的方案.
然後諮詢了一下wusheng大大之後,他說可以自己嘗試換一個支援XPack鑑權的Client,應該沒什麼太大的問題.
於是就開始了"填坑"之旅.
首先是引入x-pack-transport支援
apm-collector/apm-collector-component/client-component/pom.xml
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>x-pack-transport</artifactId> <version>${elasticsearch.client.version}</version> </dependency> <repositories> <repository> <id>elasticsearch-releases</id> <url>https://artifacts.elastic.co/maven</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
接著在 ...in/java/org/apache/skywalking/apm/collector/client/elasticsearch/ElasticSearchClient.java
加入PreBuiltXPackTransportClient的初始化
private final String securityUser; private PreBuiltXPackTransportClient initXPackClient() { Settings settings = Settings.builder() .put("cluster.name", clusterName) .put("xpack.security.transport.ssl.enabled", false) .put("xpack.security.user", securityUser) .put("client.transport.sniff", false).build(); return new PreBuiltXPackTransportClient(settings); } private PreBuiltTransportClient initClient() { Settings settings = Settings.builder()Settings settings = Settings.builder() .put("cluster.name", clusterName).put("cluster.name", clusterName) .put("client.transport.sniff", clusterTransportSniffer).put("client.transport.sniff", clusterTransportSniffer) .build();.build(); return new PreBuiltTransportClient(settings); } // 新增 private final String securityUser; // 判斷這個變數是不是null或者空字串,如果是就預設初始化,不是則使用initXPackClient初始化 // 改一下initialize 方法 private final String securityUser; @Override public void initialize() throws ClientException { if (securityUser == null || "".equals(securityUser)) { client = initClient(); } else { client = initXPackClient(); }
然後還要把apm-collector/pom.xml的elasticsearch.client.version 版本改成5.3.3.
改完之後因為5.3.3和原來5.5.0有點不一樣,需要修改一下很幾個地方的程式碼.
這時候建議直接使用IDEA build 一下,哪裡報錯改哪裡就好.
主要都是 searchResponse.getHits().totalHits 改成searchResponse.getHits().totalHits()
神奇發現5.5.0版本的ES Client把5.3.3的searchResponse.getHits().totalHits() 方法改成了屬性.
不經感慨都是人才啊...
別的一些基本都是引入 import org.elasticsearch.action.bulk.byscroll.BulkByScrollResponse;
全部程式碼在這裡:liguobao/incubator-skywalking
完整改好的程式碼在liguobao/incubator-skywalking
同時配置的時候新增一下 securityUser引數,如果ES有鑑權就傳入,沒有的話就不傳,這樣就達到鑑權和不鑑權兩種需求的相容了.
支援xpack的docker部署方案
完整原文連結:Skywalking-Dcoker for ES xpack 映象
Dockerfile說明
apache-skywalking-apm-incubating.tar.gz為支援ES X-Pack修改後打包出來的壓縮包,此倉庫沒有這個檔案的.
可以去QQ群:Apache SkyWalking交流群(392443393)群檔案中下載apache-skywalking-apm-incubating-xpack.tar.gz
或者自行編譯liguobao/incubator-skywalking/tree/5.x 此版本的原始碼.
編譯步驟:
# Prepare git, JDK8 and maven3 git clone https://github.com/liguobao/incubator-skywalking.git cd incubator-skywalking/ git checkout 5.x #Switch to the tag by using git checkout [tagname] (Optional, switch if want to build a release from source codes) git submodule init git submodule update Run ./mvnw clean package -DskipTests #All packages are in /dist.(.tar.gz for Linux and .zip for Windows).
Docker 映象名稱:liguobao/skywalking-docker
拉取映象(Pull Image):
docker pull liguobao/skywalking-docker:5.0.RC2.xpack
執行映象(Run)for ES xpack:
docker run -p 8080:8080 -p 10800:10800 -p 11800:11800 -p 12800:12800 -e ES_CLUSTER_NAME=elasticsearch -e ES_ADDRESSES=192.168.2.96:9300 -e SECURITY_USER='elastic:password' -d liguobao/skywalking-docker:5.0.RC2.xpack http://localhost:8080 -v /your/log/path:/apache-skywalking-apm-incubating/logs
環境變數(Environment Variables)
-
ES_CLUSTER_NAME
,ES_ADDRESSES
:elasticsearch 地址和叢集名稱。注意:此處Elasticsearch地址中的埠務必是Elasticsearch TCP埠。 -
SECURITY_USER
,SECURITY_USER
:elasticsearch 的賬號密碼,使用X-Pack實現的,常見阿里雲ES,格式為:'user:password'.此引數不傳入或者傳入'' ,預設使用沒有授權的client. -
NAMING_BIND_HOST
,NAMING_BIND_PORT
:OS real network IP(binding required),for agent to find collector cluster. -
BIND_HOST
,REMOTE_BIND_PORT
:OS real network IP(binding required),for collector nodes communicate with each other in cluster. collectorN --(RPC/">gRPC) --> collectorM -
AGENT_GRPC_BIND_PORT
:OS real network IP(binding required),for agent to uplink data(trace/metrics) to collector. agent--(gRPC)--> collector -
AGENT_JETTY_BIND_HOST
,AGENT_JETTY_BIND_PORT
:OS real network IP(binding required), for agent to uplink data(trace/metrics) to collector through HTTP. agent--(HTTP)--> collector
-UI_JETTY_BIND_HOST
,UI_JETTY_BIND_PORT
:Stay in0.0.0.0
if UI starts up in default mode.Change it to OS real network IP(binding required), if deploy collector in different machine.
與elasticsearch-shanghai-zone映象配合使用請參考
後記
本來還打算把程式碼提給主倉庫的,但是wusheng 大大說xpack客戶端和Apache要求的授權有衝突,遂...
那就留著自己玩了.
拜...