部署完成pinpoint之后,并没有开放报警功能,而报警是每个公司都必要的功能,以下就跟着我一起开始开发报警功能并部署到服务器。
1,下载源码包
地址:https://github.com/naver/pinpoint/releases
选择对应版本源码包,本次为1.7.1,单击下载
2,编译
源码在maven端增加了很多检查和限制,保证jdk版本1.8,maven为3.1.1就可以去除这些限制,修改后pom文件为:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <organization> <name>Naver Corporation</name> <url>http://www.navercorp.com/</url> </organization> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint</artifactId> <version>1.7.1</version> <name>pinpoint</name> <packaging>pom</packaging> <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> <repository> <id>spring-maven-repository</id> <name>Spring Framework Maven Release Repository</name> <url>http://maven.springframework.org/release/</url> </repository> <repository> <id>spring-maven-release-remote</id> <name>Spring Framework Maven Release Remote Repository</name> <url>http://repo.spring.io/libs-release-remote/</url> </repository> <repository> <id>bintray</id> <name>bintray</name> <url>http://jcenter.bintray.com</url> </repository> <repository> <id>jboss-3rd-party-releases</id> <name>Jboss Third Party Repository</name> <url>https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Maven central plugin repository</name> <url>http://repo1.maven.org/maven2/</url> </pluginRepository> </pluginRepositories> <modules> <module>annotations</module> <module>agent</module> <module>bootstrap-core</module> <module>bootstrap-core-optional</module> <module>bootstrap</module> <module>collector</module> <module>commons</module> <module>commons-hbase</module> <module>commons-server</module> <module>tools</module> <module>plugins</module> <module>profiler</module> <module>profiler-optional</module> <module>profiler-test</module> <module>rpc</module> <module>thrift</module> <module>test</module> <module>web</module> <module>hbase</module> <module>flink</module> </modules> <properties> <encoding>UTF-8</encoding> <jdk.version>1.8</jdk.version> <slf4j.version>1.7.21</slf4j.version> <metrics.version>3.1.2</metrics.version> <jetty.version>8.1.12.v20130726</jetty.version> <fastxml.jackson.version>2.6.7</fastxml.jackson.version> <httpcomponents.version>4.3</httpcomponents.version> <jedis.version>2.4.2</jedis.version> <cloverLicenseLocation>${basedir}/clover.license</cloverLicenseLocation> <spring.version>4.3.8.RELEASE</spring.version> <spring.batch.version>3.0.7.RELEASE</spring.batch.version> <spring.security.version>4.2.2.RELEASE</spring.security.version> <docker.maven.plugin.version>0.4.3</docker.maven.plugin.version> <cassandra.driver.version>2.1.7.1</cassandra.driver.version> <sniffer.artifactid>java16</sniffer.artifactid> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-annotations</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-commons</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-commons-server</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-commons-hbase</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-rpc</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-thrift</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-bootstrap-core</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-bootstrap-core-optional</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-bootstrap</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-profiler</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-profiler-optional</artifactId> <type>pom</type> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-profiler-test</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-collector</artifactId> <type>war</type> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-collector</artifactId> <classifier>classes</classifier> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-web</artifactId> <version>${project.version}</version> <type>war</type> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-web</artifactId> <classifier>classes</classifier> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-plugins</artifactId> <type>pom</type> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-plugins</artifactId> <type>zip</type> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-tools</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-test</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.navercorp.pinpoint</groupId> <artifactId>pinpoint-flink</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- for spring test --> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- serving performance metrics --> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-core</artifactId> <version>${metrics.version}</version> </dependency> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-jvm</artifactId> <version>${metrics.version}</version> </dependency> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-servlets</artifactId> <version>${metrics.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${fastxml.jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${fastxml.jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${fastxml.jackson.version}</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-shaded-client</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>com.sematext.hbasewd</groupId> <artifactId>hbasewd</artifactId> <version>0.1.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>1.3.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.20</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4.1207</version> </dependency> <dependency> <groupId>net.sourceforge.jtds</groupId> <artifactId>jtds</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>com.ning</groupId> <artifactId>async-http-client</artifactId> <version>1.8.3</version> </dependency> <dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client</artifactId> <version>2.0.32</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.6.Final</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.18.Final</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>catalina</artifactId> <version>6.0.43</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>coyote</artifactId> <version>6.0.43</version> </dependency> <dependency> <groupId>com.navercorp.arcus</groupId> <artifactId>arcus-java-client</artifactId> <version>1.8.1</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.6.9</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>${cassandra.driver.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpcomponents.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>${httpcomponents.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore-nio</artifactId> <version>${httpcomponents.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpasyncclient</artifactId> <version>4.0</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>com.google.http-client</groupId> <artifactId>google-http-client</artifactId> <version>1.20.0</version> </dependency> <dependency> <groupId>com.squareup.okhttp</groupId> <artifactId>okhttp</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.21.0-GA</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-debug-all</artifactId> <version>5.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>servlet-api</artifactId> <version>6.0.35</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.7.22</version> </dependency> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.5</version> <exclusions> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency> <!-- for zookeeper test --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-test</artifactId> <version>2.6.0</version> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> <exclusions> <exclusion> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </exclusion> <exclusion> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.13.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.18</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.7.18</version> </dependency> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.12</version> </dependency> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>io.reactivex</groupId> <artifactId>rxjava</artifactId> <version>1.2.0</version> </dependency> </dependencies> </dependencyManagement> <build> <resources> <resource> <directory>${basedir}/src/main/java</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> <resource> <filtering>true</filtering> <directory>${basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${basedir}/src/test/java</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </testResource> <testResource> <filtering>true</filtering> <directory>${basedir}/src/test/resources</directory> </testResource> </testResources> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <attachClasses>true</attachClasses> <classesClassifier>classes</classesClassifier> <webappDirectory>${project.build.directory}/deploy</webappDirectory> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>${encoding}</encoding> </configuration> </plugin> <!-- compiler插件, 设定JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <showWarnings>true</showWarnings> </configuration> </plugin> <plugin> <groupId>com.atlassian.maven.plugins</groupId> <artifactId>maven-clover2-plugin</artifactId> <version>4.0.6</version> <configuration> <encoding>${encoding}</encoding> <jdk>${jdk.version}</jdk> <generateXml>true</generateXml> <generateHtml>true</generateHtml> <generateHistorical>false</generateHistorical> <licenseLocation>${cloverLicenseLocation}</licenseLocation> <singleCloverDatabase>false</singleCloverDatabase> <includesTestSourceRoots>false</includesTestSourceRoots> <excludes> <exclude>com/navercorp/pinpoint/thrift/dto/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/apache/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/jsr166/**/*.java</exclude> <exclude>com/navercorp/pinpoint/profiler/util/jdk/**/*.java</exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.6</version> <configuration> <linkXRef>true</linkXRef> <sourceEncoding>${encoding}</sourceEncoding> <targetJdk>${jdk.version}</targetJdk> <excludes> <exclude>com/navercorp/pinpoint/thrift/dto/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/apache/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/jsr166/**/*.java</exclude> <exclude>com/navercorp/pinpoint/profiler/util/jdk/**/*.java</exclude> </excludes> </configuration> </plugin> <plugin> <groupId>com.cj.jshintmojo</groupId> <artifactId>jshint-maven-plugin</artifactId> <version>1.6.0</version> <configuration> <options>sub, boss, newcap, loopfunc</options> <globals></globals> <directories> <directory>src/main/webapp</directory> </directories> <excludes> <exclude>src/main/webapp/components</exclude> </excludes> <reporter>checkstyle</reporter> <reportFile>${project.build.directory}/jshint.xml</reportFile> <failOnError>false</failOnError> </configuration> </plugin> <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>3.0.2</version> <configuration> <nspAnalyzerEnabled>false</nspAnalyzerEnabled> <format>xml</format> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>animal-sniffer-maven-plugin</artifactId> <version>1.15</version> <configuration> <signature> <groupId>org.codehaus.mojo.signature</groupId> <artifactId>${sniffer.artifactid}</artifactId> <version>1.0</version> </signature> <ignores> <ignore>sun.*</ignore> </ignores> </configuration> <executions> <execution> <id>ensure-java-${jdk.version}-class-library</id> <phase>test</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> <inherited>false</inherited> <configuration> <aggregate>true</aggregate> <inputEncoding>${encoding}</inputEncoding> <outputEncoding>${encoding}</outputEncoding> <windowTitle>Pinpoint ${project.version} Cross Reference</windowTitle> <docTitle>Pinpoint ${project.version} Cross Reference</docTitle> </configuration> <version>2.5</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <configuration> <excludeFilterFile>findbugs-exclude.xml</excludeFilterFile> <xmlOutput>true</xmlOutput> <xmlOutputDirectory>${project.build.directory}/findbugs</xmlOutputDirectory> </configuration> <version>3.0.3</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.6</version> <configuration> <linkXRef>true</linkXRef> <sourceEncoding>${encoding}</sourceEncoding> <targetJdk>${jdk.version}</targetJdk> <!-- <rulesets> <ruleset>/rulesets/unusedcode.xml</ruleset> <ruleset>/rulesets/basic.xml</ruleset> <ruleset>/rulesets/imports.xml</ruleset> <ruleset>/rulesets/design.xml</ruleset> </rulesets> --> <excludes> <exclude>com/navercorp/pinpoint/thrift/dto/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/apache/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/jsr166/**/*.java</exclude> <exclude>com/navercorp/pinpoint/profiler/util/jdk/**/*.java</exclude> </excludes> </configuration> </plugin> <plugin> <groupId>com.atlassian.maven.plugins</groupId> <artifactId>maven-clover2-plugin</artifactId> <version>4.0.6</version> <configuration> <includesTestSourceRoots>true</includesTestSourceRoots> <licenseLocation>clover.license</licenseLocation> <encoding>${encoding}</encoding> <jdk>${jdk.version}</jdk> <excludes> <exclude>com/navercorp/pinpoint/thrift/dto/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/apache/**/*.java</exclude> <exclude>com/navercorp/pinpoint/common/util/jsr166/**/*.java</exclude> <exclude>com/navercorp/pinpoint/profiler/util/jdk/**/*.java</exclude> </excludes> </configuration> </plugin> </plugins> </reporting> <profiles> <!-- for Local (Development) --> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <env>local</env> </properties> </profile> <!-- for Release --> <profile> <id>release</id> <properties> <env>release</env> </properties> </profile> <profile> <id>klocwork</id> <build> <plugins> <plugin> <groupId>com.klocwork.ps</groupId> <artifactId>kwmaven</artifactId> <version>2.1.1</version> <configuration> <buildspec_filename>${KWINJECT_OUT_PATH}</buildspec_filename> </configuration> <executions> <execution> <phase>validate</phase> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project>
然后根目录执行 mvn clean install -Dmaven.test.skip=true
通过install命令将相关包安装进本地maven仓库之后,后期开发才没有问题。
3,新增报警类
开发工具加载web文件夹
web包下pom文件新增发送邮件依赖
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.6</version> </dependency>
然后新增AlarmMessageSenderImple类,全路径如下:com.navercorp.pinpoint.web.alarm.AlarmMessageSenderImple
源码:
package com.navercorp.pinpoint.web.alarm; import com.navercorp.pinpoint.web.alarm.checker.AlarmChecker; import com.navercorp.pinpoint.web.alarm.mail.MailSenderInfo; import com.navercorp.pinpoint.web.alarm.mail.SimpleMailSender; import com.navercorp.pinpoint.web.service.UserGroupService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; /** * Created by 许恕 on 2018/4/3. */ public class AlarmMessageSenderImple implements AlarmMessageSender{ private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private UserGroupService userGroupService; @Override public void sendSms(AlarmChecker checker, int sequenceCount) { List<String> receivers = userGroupService.selectPhoneNumberOfMember(checker.getuserGroupId()); if (receivers.size() == 0) { return; } List<String> sms = checker.getSmsMessage(); for (String message : sms) { logger.info("send SMS : {}", message); // TODO Implement logic for sending SMS } } @Override public void sendEmail(AlarmChecker checker, int sequenceCount) { List<String> receivers = userGroupService.selectEmailOfMember(checker.getuserGroupId()); if (receivers.size() == 0) { return; } for (String emailId : receivers) { /* 这个类主要是设置邮件 * mailServerHost:邮箱服务器 * userName:发送方邮件用户名 * password:发送方邮件密码 * fromAddress:发送方邮件用户名 * toAddress:接收方邮件用户名 */ MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost("smtp.21cn.com"); mailInfo.setMailServerPort("25"); mailInfo.setValidate(true); mailInfo.setUserName("[email protected]"); mailInfo.setPassword("yourpass"); mailInfo.setFromAddress("[email protected]"); mailInfo.setToAddress(emailId); mailInfo.setSubject("Pinpoint报警"); mailInfo.setContent(checker.getEmailMessage()); // 这个类主要来发送邮件 SimpleMailSender sms = new SimpleMailSender(); boolean con = false; try { con = sms.sendTextMail(mailInfo);// 发送文体格式 } catch (Exception e) { logger.error("=AlarmMessageSenderImple.sendEmail=>错误原因是:" + e.getMessage(),e); } if (con) { logger.info("=AlarmMessageSenderImple.sendEmail=>"+emailId+"发送成功!邮件内容:"+checker.getEmailMessage()); } else { logger.info("=AlarmMessageSenderImple.sendEmail=>"+emailId+"发送失败!邮件内容:"+checker.getEmailMessage()); } } } }
修改AlarmWriter使用自定义报警类
@Autowired(required=false) private AlarmMessageSender alarmMessageSender = new AlarmMessageSenderImple();修改batch.enable配置
#batch enable config
batch.enable=true
#batch server ip to execute batch
batch.server.ip=127.0.0.1
3.3配置mysql
修改jdbc.properties配置
#jdbc.properties配置信息
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.2.10:3306/ipinpoint?characterEncoding=UTF-8
jdbc.username=develop
jdbc.password=develop
编辑applicationContext-web.xml文件
在applicationContext-web.xml文件中添加如下代码
<bean id="AlarmMessageSenderImple" class="com.navercorp.pinpoint.web.alarm.AlarmMessageSenderImple">
</bean>
修改web页面,打开用户注册
修改后源码:
<div class="some-list" style="width:300px;margin-left: 15px;"> <div class="some-list-header" style="background-color:#9A9A9A;color:#FFF;"> <span class="title">Pinpoint User <span class="total"></span></span> <span class="right" style="text-decoration: underline;cursor:pointer" ng-click="onAddPinpointUser()">+ Add</span> </div> <div class="some-list-search"> <div class="input-group"> <input type="text" class="form-control" placeholder="Enter at least 2 letters to search" ng-keydown="onSearchKeydown($event)"/> <span class="input-group-btn"> <button class="btn btn-default" type="button" ng-click="onSearch()"> <span class="glyphicon glyphicon-search" aria-hidden="true"></span> </button> </span> </div> </div> <div class="some-list-content" style="color:#9A9A9A;"> <div class="wrapper _disable-check"><ul> <li class="new-group hide-me"> <input type="text" class="form-control" style="height:25px" placeholder="User Id" ng-keydown="onEditPinpointUserKeydown($event)"/> </li> <li class="new-group hide-me"> <input type="text" class="form-control" style="height:25px" placeholder="Name" ng-keydown="onEditPinpointUserKeydown($event)"/> </li> <li class="new-group hide-me"> <input type="text" class="form-control" style="height:25px" placeholder="Department" ng-keydown="onEditPinpointUserKeydown($event)"/> </li> <li class="new-group hide-me"> <input type="text" class="form-control" style="height:25px" placeholder="Phone" ng-keydown="onEditPinpointUserKeydown($event)"/> </li> <li class="new-group hide-me"> <input type="text" class="form-control" style="height:25px" placeholder="Email" ng-keydown="onEditPinpointUserKeydown($event)"/> <div style="float:right" class="_add hide-me"> <span class="glyphicon glyphicon-remove remove" aria-hidden="true" ng-click="onCancelAddPinpointUser()"></span> <span class="glyphicon glyphicon-ok edit" aria-hidden="true" ng-click="onApplyAddPinpointUser()"></span> </div> <div style="float:right" class="_edit hide-me"> <span class="glyphicon glyphicon-remove remove" aria-hidden="true" ng-click="onCancelUpdatePinpointUser()"></span> <span class="glyphicon glyphicon-ok edit-confirm" aria-hidden="true" ng-click="onApplyUpdatePinpointUser()"></span> </div> </li> <li ng-repeat="pinpointUser in pinpointUserList" id="{{prefix + pinpointUser.userId}}"> <span class="contents" style="margin-left:6px">{{"("+pinpointUser.department + ")" + pinpointUser.name}}</span> <input type="checkbox" ng-click="checkUser($event)" ng-model="pinpointUser.has"/> <div style="float:right" class="_normal" ng-show="canEditUserInfo"> <span class="glyphicon glyphicon-remove remove" aria-hidden="true" ng-click="onRemovePinpointUser($event)"></span> <span class="glyphicon glyphicon-pencil edit" aria-hidden="true" ng-click="onUpdatePinpointUser($event)"></span> </div> <div style="float:right" class="_remove hide-me" ng-show="canEditUserInfo"> <span class="glyphicon glyphicon-remove remove remove-confirm" aria-hidden="true" ng-click="onApplyRemovePinpointUser()"></span> <span class="glyphicon glyphicon-arrow-left remove-cancel" aria-hidden="true" ng-click="onCancelRemovePinpointUser()"></span> </div> </li> </ul></div> </div> <div class="some-loading hide-me"> <div class="timer-loader"></div> </div> <div class="some-alert hide-me"> <span class="message"></span> <span class="close-alert" style="color:#FFF;" ng-click="onCloseAlert()">X</span> </div> </div>
4,初始数据库
在mysql中新建一个ipinpoint库在项目resources/sql中找到两个sql文件并在ipinpoint中执行
CreateTableStatement-mysql.sql
SpringBatchJobRepositorySchema-mysql.sql
执行后结果:
5,部署
在web目录下执行 mvn clean package命令,进行打包,拿到pinpoint-web-1.7.1.war之后,按照正常部署方式进行部署。参考博客:
APM监控--(二)Pinpoint部署手册
6,操作
新增用户
新增组
用户与组关联
配置报警
报警类型说明:
SLOW COUNT / 慢请求数
当应用发出的慢请求数量超过配置阈值时触发。
SLOW RATE / 慢请求比例
当应用发出的慢请求百分比超过配置阈值时触发。
ERROR COUNT / 请求失败数
当应用发出的失败请求数量超过配置阈值时触发。
ERROR RATE / 请求失败率
当应用发出的失败请求百分比超过配置阈值时触发。
TOTAL COUNT / 总数量
当应用发出的所有请求数量超过配置阈值时触发。
SLOW COUNT TO CALLEE / 被调用的慢请求数量
当发送给应用的慢请求数量超过配置阈值时触发。
SLOW RATE TO CALLEE / 被调用的慢请求比例
当发送给应用的慢请求百分比超过配置阈值时触发。
ERROR COUNT TO CALLEE / 被调用的请求错误数
当发送给应用的请求失败数量超过配置阈值时触发。
ERROR RATE TO CALLEE / 被调用的请求错误率
当发送给应用的请求失败百分比超过配置阈值时触发。
TOTAL COUNT TO CALLEE / 被调用的总数量
当发送给应用的所有请求数量超过配置阈值时触发。
HEAP USAGE RATE / 堆内存使用率
当应用的堆内存使用率超过配置阈值时触发。
JVM CPU USAGE RATE / JVM CPU使用率
当应用的CPU使用率超过配置阈值时触发。
7,问题
虽然pinpoint配置便捷,但是告警功能开发简单,不能丰富的配置,需要二次开发,最坑的是配置的规则80%都是默认的,通过看源码发现,基本都是写死的
以com.navercorp.pinpoint.common.trace.BaseHistogramSchema为例
报警规则源码:
public static final HistogramSchema FAST_SCHEMA = new BaseHistogramSchema(1, (short) 100, "100ms", (short) 300, "300ms", (short) 500, "500ms", "Slow", "Error", (short) -100, "100ms", (short) -300, "300ms", (short) -500, "500ms", (short) -999, "Slow"); public static final HistogramSchema NORMAL_SCHEMA = new BaseHistogramSchema(2, (short) 1000, "1s", (short) 3000, "3s", (short) 5000, "5s", "Slow", "Error", (short) -1000, "1s", (short) -3000, "3s", (short) -5000, "5s", (short) -9999, "Slow");