docker部署pinpoint,監控docker中的Springboot專案
pinpoint是一個開源的java監控專案,也是分散式監控專案中比較知名的。
網上有比較多的pinpoint部署指南,但都是基於主機部署的,這一篇主要是講將pinpoint部署到docker中,並監控同樣部署在docker的Springboot專案。
pinpoint包含4個部分,hbase,collector,web,agent。
docker部署HBase
Dockerfile如下:
# DESCRIPTION Pinpoint APM HBase (Data Storage)
# TO_BUILD docker build -t pinpoint-hbase .
# TO_RUN docker run -d --net=host -p 2181:2181 -p 60000:60000 -p 16010:16010 -p 60020:60020 -p 16030:16030 --name=pinpoint-hbase pinpoint-hbase
FROM java:8-jdk
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
ENV HBASE_VERSION=1.2.5
ENV HBASE_HOME=/opt/hbase/hbase-$HBASE_VERSION
ENV PINPOINT_VERSION=1.6.2
ENV HBASE_REPOSITORY=http://apache.mirrors .pair.com/hbase
ENV HBASE_SUB_REPOSITORY=http://archive.apache.org/dist/hbase
RUN mkdir -p /opt/hbase \
&& cd /opt/hbase \
&& curl -fSL "$HBASE_REPOSITORY/$HBASE_VERSION/hbase-$HBASE_VERSION-bin.tar.gz" -o hbase.tar.gz || curl -fSL "$HBASE_SUB_REPOSITORY/$HBASE_VERSION/hbase-$HBASE_VERSION-bin.tar.gz" -o hbase.tar.gz \
&& tar xfvz hbase.tar.gz \
&& rm -rf hbase.tar.gz
ADD hbase-site.xml /opt/hbase/hbase-$HBASE_VERSION/conf/hbase-site.xml
RUN curl -SL "https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/hbase/scripts/hbase-create.hbase" -o /opt/hbase/hbase-create.hbase \
&& $HBASE_HOME/bin/start-hbase.sh \
&& sleep 10 \
&& $HBASE_HOME/bin/hbase shell /opt/hbase/hbase-create.hbase \
&& $HBASE_HOME/bin/stop-hbase.sh
VOLUME ["/home/pinpoint/hbase", "/home/pinpoint/zookeeper"]
# zookeeper
EXPOSE 2181
# HBase Master API port
EXPOSE 60000
# HBase Master Web UI
EXPOSE 16010
# Regionserver API port
EXPOSE 60020
# HBase Regionserver web UI
EXPOSE 16030
ENTRYPOINT /opt/hbase/hbase-$HBASE_VERSION/bin/hbase master start
hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/pinpoint/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/pinpoint/zookeeper</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>60020</value>
</property>
</configuration>
docker部署collector
Dockerfile如下
FROM tomcat:8-jre8
ENV PINPOINT_VERSION=1.6.2
ADD start-collector.sh /usr/local/bin/
RUN chmod a+x /usr/local/bin/start-collector.sh \
&& mkdir -p /assets \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/collector/src/main/resources/pinpoint-collector.properties -o /assets/pinpoint-collector.properties \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/collector/src/main/resources/hbase.properties -o /assets/hbase.properties \
&& curl -SL https://github.com/naver/pinpoint/releases/download/$PINPOINT_VERSION/pinpoint-collector-$PINPOINT_VERSION.war -o pinpoint-collector.war \
&& rm -rf /usr/local/tomcat/webapps \
&& mkdir -p /usr/local/tomcat/webapps \
&& sed -i -e 's/8005/9005/' /usr/local/tomcat/conf/server.xml \
&& sed -i -e 's/8080/9080/' /usr/local/tomcat/conf/server.xml \
&& sed -i -e 's/8009/9009/' /usr/local/tomcat/conf/server.xml \
&& sed -i -e 's/8443/9443/' /usr/local/tomcat/conf/server.xml \
&& unzip pinpoint-collector.war -d /usr/local/tomcat/webapps/ROOT \
&& rm -rf pinpoint-collector.war
EXPOSE 9994 9995 9996
ENTRYPOINT ["/usr/local/bin/start-collector.sh"]
start-collector.sh
#!/bin/bash
set -e
set -x
CLUSTER_ENABLE=${CLUSTER_ENABLE:-false}
COLLECTOR_TCP_PORT=${COLLECTOR_TCP_PORT:-9994}
COLLECTOR_UDP_STAT_LISTEN_PORT=${COLLECTOR_UDP_STAT_LISTEN_PORT:-9995}
COLLECTOR_UDP_SPAN_LISTEN_PORT=${COLLECTOR_UDP_SPAN_LISTEN_PORT:-9996}
HBASE_HOST=${HBASE_HOST:-localhost}
HBASE_PORT=${HBASE_PORT:-2181}
DISABLE_DEBUG=${DISABLE_DEBUG:-true}
cp /assets/pinpoint-collector.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties
cp /assets/hbase.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
sed -i "s/cluster.enable=true/cluster.enable=${CLUSTER_ENABLE}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties
sed -i "s/collector.tcpListenPort=9994/collector.tcpListenPort=${COLLECTOR_TCP_PORT}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties
sed -i "s/collector.udpStatListenPort=9995/collector.udpStatListenPort=${COLLECTOR_UDP_STAT_LISTEN_PORT}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties
sed -i "s/collector.udpSpanListenPort=9996/collector.udpSpanListenPort=${COLLECTOR_UDP_SPAN_LISTEN_PORT}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties
sed -i "s/hbase.client.host=localhost/hbase.client.host=${HBASE_HOST}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
sed -i "s/hbase.client.port=2181/hbase.client.port=${HBASE_PORT}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
if [ "$DISABLE_DEBUG" == "true" ]; then
sed -i 's/level value="DEBUG"/level value="INFO"/' /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/log4j.xml
fi
exec /usr/local/tomcat/bin/catalina.sh run
docker部署web
Dockerfile如下:
# DESCRIPTION Pinpoint APM Web (User Interface)
# TO_BUILD docker build -t pinpoint-web .
# TO_RUN docker run -d -p 8080:8080 --net=host -e HBASE_HOST=<HOST_IP> -e HBASE_PORT=2181 --name=pinpoint-web pinpoint-web
FROM tomcat:8-jre8
ENV PINPOINT_VERSION=1.6.2
ADD start-web.sh /usr/local/bin/
RUN chmod a+x /usr/local/bin/start-web.sh \
&& mkdir -p /assets/ \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/web/src/main/resources/pinpoint-web.properties -o /assets/pinpoint-web.properties \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/web/src/main/resources/hbase.properties -o /assets/hbase.properties \
&& curl -SL https://github.com/naver/pinpoint/releases/download/$PINPOINT_VERSION/pinpoint-web-$PINPOINT_VERSION.war -o pinpoint-web.war \
&& rm -rf /usr/local/tomcat/webapps \
&& mkdir -p /usr/local/tomcat/webapps \
&& unzip pinpoint-web.war -d /usr/local/tomcat/webapps/ROOT \
&& rm -rf pinpoint-web.war
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/start-web.sh"]
start-web.sh
#!/bin/bash
set -e
set -x
CLUSTER_ENABLE=${CLUSTER_ENABLE:-false}
ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
HBASE_HOST=${HBASE_HOST:-localhost}
HBASE_PORT=${HBASE_PORT:-2181}
DISABLE_DEBUG=${DISABLE_DEBUG:-true}
DISABLE_ANALYTICS=${DISABLE_ANALYTICS:-true}
cp /assets/pinpoint-web.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-web.properties
cp /assets/hbase.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
sed -i "s/cluster.enable=true/cluster.enable=${CLUSTER_ENABLE}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-web.properties
sed -i "s/admin.password=admin/admin.password=${ADMIN_PASSWORD}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-web.properties
sed -i "s/hbase.client.host=localhost/hbase.client.host=${HBASE_HOST}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
sed -i "s/hbase.client.port=2181/hbase.client.port=${HBASE_PORT}/g" /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/hbase.properties
if [ "$DISABLE_DEBUG" == "true" ]; then
sed -i 's/level value="DEBUG"/level value="INFO"/' /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/log4j.xml
fi
if [ "$DISABLE_ANALYTICS" == "true" ]; then
sed -i 's/config.sendUsage.*/config.sendUsage=false/' /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/pinpoint-web.properties
fi
exec /usr/local/tomcat/bin/catalina.sh run
agent先不管它,我們先把上面的3個元件部署到伺服器上。
我使用的rancher來管理docker,根據上面的Dockerfile分別build能得到對應的映象,下面來展示一下部署到rancher時的配置。
第一步,先部署hbase,只需要注意一點即可
第二步,部署collector
新增Hbase的link,並且配置一些環境變數,一樣需要指定主機名
第三步,部署web
同樣是設定環境變數,主機名
以上配置完即可,就可以訪問到pinpoint的web介面了。
下面來看一下如何監控docker中的Springboot專案。
pinpoint採用的是無侵入的方式,對於Springboot專案是啟動一個jar這種型別的來說,就是使用
java -javaagent:/assets/pinpoint-agent/pinpoint-bootstrap-1.6.2.jar -Dpinpoint.agentId=schedul-in-docker -Dpinpoint.applicationName=schedul -jar /app.jar
這種方式,指明pinpoint-bootstrap的位置,再加上agentId和applicationName就行了。pinpoint-bootstrap.jar是在pinpoint-agent中,還需要在pinpoint-agent中指明collector的ip即可。
那麼怎麼讓我們的Springboot專案知道pinpoint-agent在哪裡呢?
常見的有兩種方式,一是繫結宿主機目錄,將pinpoint-agent放到宿主機中,然後在docker裡訪問宿主機的pinpoint-agent,這樣的話,你還需要另外一個docker容器來存放agent,因為agent需要知道collector的ip地址,而宿主機是不能訪問docker容器內的ip的,得用docker link的方式。
二是直接在Springboot專案裡下載並配置agent,我就是採用的這種方式。
像普通的Springboot專案如果部署到docker,Dockerfile如下:
FROM daocloud.io/brave8/maven-jdk8
ADD pom.xml /tmp/build/
ADD src /tmp/build/src
#構建應用
RUN cd /tmp/build && mvn clean package \
#拷貝編譯結果到指定目錄
&& mv target/*.jar /app.jar \
#清理編譯痕跡
&& cd / && rm -rf /tmp/build
VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
這樣一個Dockerfile就可以了。如果我要同時把pinpoint-agent也配置進來,Dockerfile如下:
FROM daocloud.io/brave8/maven-jdk8
ENV PINPOINT_VERSION=1.6.2
ADD configure.sh /usr/local/bin/
ADD pom.xml /tmp/build/
ADD src /tmp/build/src
#構建應用
RUN cd /tmp/build && mvn clean package \
#拷貝編譯結果到指定目錄
&& mv target/*.jar /app.jar \
#清理編譯痕跡
&& cd / && rm -rf /tmp/build \
&& chmod a+x /usr/local/bin/configure.sh \
&& mkdir -p /assets/pinpoint-agent \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/agent/src/main/resources-release/pinpoint.config -o /assets/pinpoint.config \
&& curl -SL https://github.com/naver/pinpoint/releases/download/$PINPOINT_VERSION/pinpoint-agent-$PINPOINT_VERSION.tar.gz -o pinpoint-agent-$PINPOINT_VERSION.tar.gz \
&& gunzip pinpoint-agent-$PINPOINT_VERSION.tar.gz \
&& tar -xf pinpoint-agent-$PINPOINT_VERSION.tar -C /assets/pinpoint-agent \
&& curl -SL https://raw.githubusercontent.com/naver/pinpoint/$PINPOINT_VERSION/agent/src/main/resources-release/lib/log4j.xml -o /assets/pinpoint-agent/lib/log4j.xml \
&& sed -i 's/DEBUG/INFO/' /assets/pinpoint-agent/lib/log4j.xml \
&& rm pinpoint-agent-$PINPOINT_VERSION.tar
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/configure.sh"]
configure.sh如下
#!/usr/bin/env bash
set -e
set -x
COLLECTOR_IP=${COLLECTOR_IP:-127.0.0.1}
cp -f /assets/pinpoint.config /assets/pinpoint-agent/pinpoint.config
sed -i "s/profiler.collector.ip=127.0.0.1/profiler.collector.ip=${COLLECTOR_IP}/g" /assets/pinpoint-agent/pinpoint.config
java -javaagent:/assets/pinpoint-agent/pinpoint-bootstrap-1.6.2.jar -Dpinpoint.agentId=schedul-in-docker -Dpinpoint.applicationName=schedul -jar /app.jar
這個就是比普通的Springboot專案多了一個下載agent,並配置collector ip的地方。
部署這個Springboot專案時,需要新增一個環境變數COLLECTOR_IP,指明為collector的ip即可。
以上就完成了pinpoint在docker部署的全步驟,說的比較精簡,需要對pinpoint的部署和docker比較瞭解才能看懂。