写点什么

Docker 下,极速体验 pinpoint1.6.3

作者:程序员欣宸
  • 2022 年 4 月 25 日
  • 本文字数:3920 字

    阅读完需:约 13 分钟

Docker下,极速体验pinpoint1.6.3

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


本篇概览

  • pinpoint 在分布式系统中的广泛应用,今天来体验 pinpoint 所提供的监控、调用链跟踪等服务,本次实战只关心体验服务,至于环境如何搭建、服务如何配置,留待下一次实战吧;

环境规划

  • 整个体验环境有下列三个容器:


  1. pinpoint 的 collector,web,hbase 都集成在同一个容器上;

  2. tomcat001,上面部署了 web 应用,提供几个 web 服务,其中有一个可以向另一个服务发起 http 请求;

  3. tomcat002,部署的 web 应用和 tomcat001 一模一样,在访问 tomcat001 的服务时,tomcat001 会向 tomcat002 发起请求;


  • 环境信息如下:


docker-compose 配置

  • 由于涉及到三个容器,还是通过 docker-compose.yml 来批量控制吧,文件内容如下:


version: '2'services:  pinpoint-server:     image: bolingcavalry/centos67-hbase126-pinpoint163-server:0.0.1    container_name: pinpoint-server    ports:      - "19001:22"      - "28080:28080"    restart: always  tomcat001:     image: bolingcavalry/centos67-pinpoint163-agent:0.0.1    container_name: tomcat001    links:       - pinpoint-server:pinpointhost    ports:      - "8081:8080"    environment:      TOMCAT_SERVER_ID: tomcat001      PINPOINT_AGENT_ID: ppagent20171105001       PINPOINT_APPLICATION_NAME: app20171105001    restart: always   tomcat002:     image: bolingcavalry/centos67-pinpoint163-agent:0.0.1    container_name: tomcat002    depends_on:      - tomcat001    links:       - pinpoint-server:pinpointhost    ports:      - "8082:8080"    environment:      TOMCAT_SERVER_ID: tomcat002      PINPOINT_AGENT_ID: ppagent20171105002       PINPOINT_APPLICATION_NAME: app20171105002    restart: always 
复制代码


  • 上面的配置有几个关键信息:


  1. tomcat001 和 tomcat002 都通过 link 属性配置将 pinpoint-server 的 ip 加入了 hosts 配置中,可以用 pinpointhost 来取代 pinpoint-server 的地址;

  2. TOMCAT_SERVER_ID 用来区分容器的身份;

  3. PINPOINT_AGENT_ID 和 PINPOINT_APPLICATION_NAME 是应用启动时候用到的,作为应用在 pinpoint 的 web 服务中的唯一身份;

启动所有容器

  • 在 docker-compose.yml 文件所在目录下,执行以下命令启动所有容器:

docker-compose up -d
复制代码

初始化 pinpoint

  • 执行以下命令进入 pinpoint-server 容器:

docker exec -it pinpoint-server /bin/bash
复制代码


  • 启动 hbase:

start-hbase.sh
复制代码


  • 初始化数据:

  • 在 pinpoint-server 容器中执行以下命令,就会将 pinpoint 所需的数据倒入到 hbase 中:

hbase shell /usr/local/work/hbase-create.hbase
复制代码


  • 启动 collector 应用:

/usr/local/work/tomcat-collector/apache-tomcat-8.0.36/bin/startup.sh
复制代码


  • 执行以下命令可以查看启动情况:

tail -f /usr/local/work/tomcat-collector/apache-tomcat-8.0.36/logs/catalina.out
复制代码
  • 当输出了如下图信息时,表明 collector 启动成功:

  • 启动 web 应用:

/usr/local/work/tomcat-web/apache-tomcat-8.0.36/bin/startup.sh
复制代码


  • 执行以下命令可以查看启动情况:

tail -f /usr/local/work/tomcat-web/apache-tomcat-8.0.36/logs/catalina.out
复制代码


  • 当输出了如下图信息时,表明 collector 启动成功:

访问 web 服务

  • 在本机打开浏览器输入**http://localhost:28080/**试试,可以看到 pinpoint 的 web 页面如下图:

  • 如上图红框所示,我们明明已经启动了两个配置了 pinpoint agent 的容器,为何点击红框位置没有出来呢?

  • tomcat001 和 tomcat002 容器中的 tomcat 服务是随着容器启动的,也就是说 docker-compose up -d 命令执行完毕后两个 tomcat 已经启动成功了,但是这时候我们的 pinpoint-server 的初始化还没做,collector 和 web 服务也还没有启动呢,所以,应该重启 tomcat001 和 tomcat002 两个容器,让它们的 tomcat 服务重新启动并连接到 pinpoint-server 上来;

  • 执行以下命令重启 tomcat001 和 tomcat002:

docker restart tomcat001 tomcat002
复制代码


  • 这时候重新打开 http://localhost:28080/,就能看到两个应用了,如下图:


  • 来看看应用服务器的基本情况,选中应用"app20171105001",再操作如下图所示:

  • 以看到如下图的各类曲线图,内存、线程、TPS 等:

查看访问请求

  • tomcat 自带了一些简单的 servlet 服务,例如:http://localhost:8081/examples/servlets/servlet/HelloWorldExample

  • 在浏览器里访问几次试试,然后再回到 pinpoint 的 web 首页,可以看到下图的效果,右边红框中的一些绿点代表应用被访问的情况,如果看不到绿点,记得在黄框所示区域选择合适的时间段:


  • 鼠标在上图红框位置拖动,就会弹出一个页面,里面展示了访问情况列表,如下图:

  • 上图列表中,点击其中一条访问记录,列表的下面展示了这个请求内部的调用情况;

部署一个 web 应用

  • 接下来开发一个 web 应用,这个应用可以从 tomcat001 向 tomcat002 发起 http 请求,这样我们就能体验到 pinpoint 追踪调用链的能力;

  • web 应用的源码在 git 上可以下载,地址是:git@github.com:zq2599/blog_demos.git,里面有多个工程,本次实战用到的是 pinpointtracedemo,如下图:

  • 第一部分关键代码如下,我们调用的 gson 库的 toJson 方法,将 bean 转换成字符串:

@RequestMapping("/tracegson")    @ResponseBody    public String tracegson(HttpServletRequest request, Model model) {        String name = get(request, "name");        String age = get(request, "age");
Student student = new Student(); student.setName(name); student.setAge(Integer.valueOf(age));
Gson gson = new Gson();
String parseStr = gson.toJson(student, Student.class);
logger.info("gson str [{}]", parseStr);
return String.format("gson str : %s [%s]", parseStr, tag()); }
复制代码


  • 第二段关键代码如下,应用可以向指定的 ip 和端口发起一次 http 请求,也就是可以从 tomcat001 向 tomcat002 发起请求,请求 dotrace 接口的服务:

public String sendSimpleMsg(String ip, String port, String content) {        String result = "";        BufferedReader in = null;        try {            String urlNameString = "http://" + ip + ":" + port + "/pinpointtracedemo/dotrace?content=" + content;            URL realUrl = new URL(urlNameString);            // 打开和URL之间的连接            URLConnection connection = realUrl.openConnection();            // 设置通用的请求属性            connection.setRequestProperty("accept", "*/*");            connection.setRequestProperty("connection", "Keep-Alive");            connection.setRequestProperty("user-agent",                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            // 建立实际的连接            connection.connect();            // 获取所有响应头字段            Map<String, List<String>> map = connection.getHeaderFields();            // 遍历所有的响应头字段            for (String key : map.keySet()) {                logger.info(key + "--->" + map.get(key));            }            // 定义 BufferedReader输入流来读取URL的响应            in = new BufferedReader(new InputStreamReader(                    connection.getInputStream()));            String line;            while ((line = in.readLine()) != null) {                result += line;            }        } catch (Exception e) {            logger.error("发送GET请求出现异常!" + e);            e.printStackTrace();        }        // 使用finally块来关闭输入流        finally {            try {                if (in != null) {                    in.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }        return result;    }
复制代码


  • 代码准备好,接下来就是部署了,tomcat001 和 tomcat002 这两个容器都支持在线部署 web 应用,关于 tomcat 的在线部署,是预先在 tomcat 的 tomcat-users.xml 文件中做好配置,再通过 maven 的 tomcat7-maven-plugin 插件来实现的,tomcat001 和 tomcat002 的 tomcat-users.xml 文件已经改好了,对应 tomcat 管理员账号 bolingcavalry,密码 bolingcavalrypswd

  • 关于 tomcat 在线部署的详情,请看《实战 docker,编写 Dockerfile 定制 tomcat 镜像,实现 web 应用在线部署》;

  • tomcat001 的 8080 端口被映射到了当前电脑的 8081,tomcat002 的 8080 端口被映射到了当前电脑的 8082,所以在用 maven 做在线部署的时候,记得将端口号分别改成 8081 和 8082,如下图:



  • 部署完毕,先试一下 gson 服务的监控,访问:http://localhost:8081/pinpointtracedemo/tracegson?name=tom&age=11

  • 然后去 pinpoint 上看一下,如下图,从 controller 到 toJson 的调用都被 pinpoint 记录下来了:



  • 接下来试试这个地址:http://localhost:8081/pinpointtracedemo/sendrequest?ip=172.18.0.4&port=8080&content=abcdef

  • tomcat001 收到这个请求后,就会向 tomcat002 发起请求,我们在 pinpoint 上看看:



  • 如上图所示,从 tomcat001 到 tomcat002 的调用情况都清清楚楚的展现出来了;

  • 至此,pinpoint 的体验就完成了,我们对 pinpoint 的基础能力有了初步的了解,关于详细的环境搭建,以及 pinpoint 插件的细节,留待后面的实战中我们一起去体验。

InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 2
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Docker下,极速体验pinpoint1.6.3_Java_程序员欣宸_InfoQ写作社区