10-5 Skywalking基于nginx+jenkins服务的全链路数据收集

2023-05-16

文章目录

  • 前言
  • Jenkins案例
    • 安装Jenkins
    • 安装Skywalking-Java-Agent
  • Nginx案例
    • 安装OpenResty
    • 安装Skywalking-Nginx-Lua
    • 全链路追踪


前言

在上一节 10-4 Skywalking介绍,二进制与docker部署Skywalking,Skywalking收集Java博客案例,Skywalking面板介绍 我们介绍的Skywalking组件,部署和java博客案例等。

这一节继续扩展数据收集案例。将部署基于Java开发的一种持续集成工具Jenkins,和高性能的HTTP和反向代理web服务器Nginx,并在Skywalking对两个应用实现全链路追踪。


IP名称应用
192.168.100.201Skywalking服务器Skywalking-OAP, Skywalking-UI
192.168.100.204Jenkins服务器Java JDK 11, Tomcat 9, Jenkins 2.361, Skywalking-Java-Agent
192.168.100.205Nginx服务器OpenResty 1.21(带Lua模块的Nginx), Skywalking-Nginx-Lua-Agent



Jenkins案例

安装Jenkins

安装 Java JDK 11 版本

yum install -y java-11-openjdk

安装 Tomcat 9.0.68 版本

wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz

tar zxvf apache-tomcat-9.0.68.tar.gz
mkdir /apps
mv apache-tomcat-9.0.68 /apps

下载 Jenkins 2.361.3 版本

curl -LO https://get.jenkins.io/war-stable/2.361.3/jenkins.war

mv jenkins.war /apps/apache-tomcat-9.0.68/webapps/

安装Skywalking-Java-Agent

下载 apache-skywalking-java-agent-8.8.0 版本

wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz

tar zxvf apache-skywalking-java-agent-8.8.0.tgz
mv skywalking-agent/ /apps/

Tomcat的配置文件,在java启动时,加载javaagent:

vim +125 /apps/apache-tomcat-9.0.68/bin/catalina.sh

125 CATALINA_OPTS="$CATALINA_OPTS -javaagent:/apps/skywalking-agent/skywalking-agent.jar"
126 export CATALINA_OPTS

Agent的配置文件,与Skywalking关联:

vim /apps/skywalking-agent/config/agent.config

# 项目名称
18 agent.namespace=${SW_AGENT_NAMESPACE:my_project}
# 服务名称
21 agent.service_name=${SW_AGENT_NAME:my_project_jenkins}
# skywalking地址
93 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.201:11800}

启动tomcat和agent,停用防火墙,监听端口为8080:

nohup /apps/apache-tomcat-9.0.68/bin/catalina.sh run &>>/root/catalina.log &

sudo systemctl disable --now firewalld.service

netstat -lntp | grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1540/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      1540/java

开机自启动tomcat,一定要nohup后台运行,否则开不了机。

echo "nohup /apps/apache-tomcat-9.0.68/bin/catalina.sh run &>>/root/catalina.log &" >> /etc/rc.local
chmod +x /etc/rc.d/rc.local

访问 http://192.168.100.204:8080/jenkins/ 进入初始化页面,按提示粘贴密码:

在这里插入图片描述

初始化完毕,进入Jenkins主页面:

在这里插入图片描述

在Skywalking服务器追踪到Jenkins网站的链路数据:

在这里插入图片描述

Nginx案例

SkyWalking Nginx Agent只为Nginx提供了由Nginx LUA模块驱动的本机跟踪功能。Nginx不自带LUA模块,可以编译安装或者使用openresty。

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。

OpenResty官网
https://openresty.org/


安装OpenResty

配置相关yum源:

# 添加openresty的repo源
wget https://openresty.org/package/centos/openresty.repo
mv openresty.repo /etc/yum.repos.d/

# 更新yum索引:
sudo yum check-update

在线安装openresty,监听端口为80:

# 使用yum安装openresty
sudo yum install -y openresty

# 使用systemctl管理服务
sudo systemctl enable --now openresty.service
sudo systemctl status openresty.service

netstat -ltnp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1649/nginx: master

sudo systemctl disable --now firewalld.service

访问 http://192.168.100.205 进入欢迎页面:

在这里插入图片描述

安装Skywalking-Nginx-Lua

skywalking-nginx-lua是nginx的agent,基本由lua语言编写,所以需要nginx有lua模块。

wget https://github.com/apache/skywalking-nginx-lua/archive/refs/tags/v0.6.0.tar.gz

tar zxvf v0.6.0.tar.gz
mkdir /apps
mv skywalking-nginx-lua-0.6.0 /apps

Nginx主配置文件,通过systemctl status openresty.service找到路径:

vim /usr/local/openresty/nginx/conf/nginx.conf

http {
	# 在http里添加子配置文件路径
    include /apps/openresty/*.conf
    ...

}

Nginx子配置文件,可参考github。配置内容较多,关注有中文注释的行数:

SkyWalking Nginx Agent配置文件说明
https://github.com/apache/skywalking-nginx-lua

vim /apps/openresty/mysite.conf

##### 指定skywalking的lua包路径 #####
lua_package_path "/apps/skywalking-nginx-lua-0.6.0/lib/?.lua;;";

# Buffer represents the register inform and the queue of the finished segment
lua_shared_dict tracing_buffer 100m;

# Init is the timer setter and keeper
# Setup an infinite loop timer to do register and trace report.
init_worker_by_lua_block {
    local metadata_buffer = ngx.shared.tracing_buffer

    -- Set service name
    ##### 在skywalking显示的服务名 #####
    metadata_buffer:set('serviceName', 'my_project_nginx')
    -- Instance means the number of Nginx deployment, does not mean the worker instances
    ##### 在skywalking显示的实例名 #####
    metadata_buffer:set('serviceInstanceName', 'nginx_node1')
    -- type 'boolean', mark the entrySpan include host/domain
    metadata_buffer:set('includeHostInEntrySpan', false)
    -- set ignoreSuffix, If the operation name(HTTP URI) of the entry span includes suffixes in this set, this segment would be ignored. Multiple values should be separated by a comma(',').
    -- require("skywalking.util").set_ignore_suffix(".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.svg")

    -- set random seed
    require("skywalking.util").set_randomseed()
    ##### 关联skywalking客户端IP与端口,注意是12800,不是11900 #####
    require("skywalking.client"):startBackendTimer("http://192.168.100.201:12800")

    -- If there is a bug of this `tablepool` implementation, we can
    -- disable it in this way
    -- require("skywalking.util").disable_tablepool()

    skywalking_tracer = require("skywalking.tracer")
}

server {
    listen 80;
    ##### nginx监听域名 #####
    server_name www.mysite.com;
    ##### nginx监听路径 #####
    location /jenkins {
        default_type text/html;

        rewrite_by_lua_block {
            ------------------------------------------------------
            -- NOTICE, this should be changed manually
            -- This variable represents the upstream logic address
            -- Please set them as service logic name or DNS name
            --
            -- Currently, we can not have the upstream real network address
            ------------------------------------------------------
            ##### skywalking追踪的服务 #####
            skywalking_tracer:start("www.mysite.com")
            -- If you want correlation custom data to the downstream service
            -- skywalking_tracer:start("upstream service", {custom = "custom_value"})
        }
		
		##### nginx代理路径,这里设成jenkins服务器  #####
        proxy_pass http://192.168.100.204:8080/jenkins;

        body_filter_by_lua_block {
            if ngx.arg[2] then
                skywalking_tracer:finish()
            end
        }

        log_by_lua_block {
            skywalking_tracer:prepareForReport()
        }
    }
}

测试nginx配置语法和使用,重启openresty服务:

sudo /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful

sudo systemctl restart openresty.service

全链路追踪

Windows电脑上修改hosts文件,192.168.100.205 为Nginx服务器:

C:\Windows\System32\drivers\etc

192.168.100.205 www.mysite.com

访问 www.mysite.com/jenkins 重新进入jenkins管理页面:

在这里插入图片描述

在Skywalking服务器追踪到Nginx和Jenkins两个应用的链路情况:

在这里插入图片描述

Nginx和Jenkins的拓步图:用户请求Nginx会转发到www.mysite.com,mysite对应jenkins,直接被Skywalking追踪:

在这里插入图片描述



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10-5 Skywalking基于nginx+jenkins服务的全链路数据收集 的相关文章

  • 在 jenkins 中运行 Maven 项目时出现 java.lang.reflect.InitationTargetException

    这是堆栈跟踪树 我在 Jenkins 中运行我的 Maven 项目时得到的 我不明白我的代码有什么问题 也许是因为 Jenkins 中的一些插件 lt JENKINS REMOTING CAPACITY gt channel started
  • nginx上传client_max_body_size问题

    我正在运行 nginx ruby on rails 并且有一个简单的多部分表单来上传文件 一切正常 直到我决定限制要上传的文件的最大大小 为此 我设置了 nginxclient max body size to 1m 1MB 并且当该规则被
  • 如何仅根据拉取请求在 Jenkins 中运行阶段?

    我现在有一个基于 Jenkinsfile 的管道 其中包含多个阶段 每次提交到 Github 时都会由 webhook 触发 我想在每次提交时保持 构建 和 单元测试 阶段运行 但仅在分支准备拉取请求时运行 集成测试 阶段 我想要的是 st
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • 如何使用远程访问 API 获取 jenkins 的系统配置

    詹金斯提供了很好的远程访问API https wiki jenkins ci org display JENKINS Remote access API 可用于获取大量信息 例如作业和视图 我想知道是否或如何从远程访问 API 获取系统 全
  • JMeter:来自 Jenkins 的九个以上参数

    我试图将超过九个参数从 Jenkins 传递到 JMeter4 0 当我阅读时 我发现 JMeter 不接受超过 9 个参数 作为解决方法 我想将所有参数作为字符串传递 并在 JMeter BeanShell 中将其拆分 java jar
  • 降低 Sonar 2.1.x 中的日志级别

    我有一个 Maven 3 x 版本 它使用 Sonar 2 1 x 进行质量控制 maven sonar 插件在 Jenkins 内部使用来运行声纳检查 在 Jenkins 构建过程中 当 Sonar 启动时 它会在 INFO 级别记录很多
  • 詹金斯管道如果其他不工作

    我正在创建一个示例詹金斯管道 这是代码 pipeline agent any stages stage test steps sh echo hello stage test1 steps sh echo TEST stage test3
  • nginx 代理到子目录中的远程 Node.js Express 应用程序

    我完全陷入了这样一种情况 我想在一台服务器上拥有多个节点应用程序 通过让应用程序在不同的端口上运行 我可以正常工作 我可以通过输入 IP 地址和端口来访问应用程序 我想通过使用不同的子目录来代理来自 nginx 服务器的应用程序 如下所示
  • jbehave 与 jenkins 的集成

    我必须将 jbehave 与 jenkins 集成 但我不知道该怎么做 我看到我必须在 Jenkins 中创建一个任务 但我不知道应该在哪里连接 jbehave 与此任务 有人可以帮助我吗 Thanks Sarang 所以我假设您已将 JB
  • Docker nginx 代理到主机

    简短的介绍 Nginx 运行在 docker 上 如何配置 nginx 以便将调用转发到主机 详细描述 我们有一个 Web 应用程序与几个后端通信 假设为rest1 rest2 和rest3 我们负责rest1 让我们考虑一下我开始rest
  • 连接到上游时 Django Gunicorn nginx(111:连接被拒绝)

    一个Django应用程序在AWS实例上运行 通过gunicorn和nginx配置 它运行良好一年多了 但是突然 我收到了502 bad gateway错误 然后我在nginx错误日志中看到了下面提到的消息 2017 05 17 16 18
  • 从 Jenkinsfile 设置管道名称和描述

    我正在尝试将 jenkins 管道的 poc 作为代码 我正在使用 Github 组织文件夹插件来扫描 Github 组织并为每个分支创建作业 有没有办法显式定义从 Jenkinsfile 获取的管道作业的名称 我还想添加一些职位描述 你需
  • 在 Nginx 中使用查询参数绕过基本身份验证

    在我的 nginx 配置中 我打开了基本身份验证来限制对站点的访问 如下所示 auth basic Restricted Area auth basic user file path to htpasswd 这适用于用户 但我们使用的一些工
  • iFrame 在 Facebook Canvas 应用程序中显示为空白

    我有一个非常简单的页面 我试图在 Facebook iframe 中查看它 它是一个 Django 视图 但它不依赖于请求是通过 POST 还是 GET 提交 它所做的只是返回一些简单的 HTML 如果我们直接点击链接 它会正确显示 如果在
  • nginx - 使用 ssl 支持设置多个 server_name

    我很想使用 nginx 来为具有多个域名和 SSL 的网站提供服务 webmail example com webmail beispiel de 两者都使用相同的虚拟主机 因此我只设置 server name 两次 问题是 我需要 ngi
  • Jenkins 通过 ssh 发布显示错误“jenkins.plugins.publish_over.BapPublisherException:无法添加 SSH 密钥。”

    为了使用 ssh 连接 jenkins 与远程服务器 我在 jenkins 中安装了通过 SSH 发布的插件 但配置后 它显示错误为 jenkins plugins publish over BapPublisherException 无法
  • 您可以在不暴露任何端口的情况下使用 nginx 反向代理到 docker 容器吗?

    我想知道是否可以将 nginx 与 docker compose 一起使用作为 api 网关 反向代理 ssl 终止点 而不暴露其后面容器上的任何端口 IE 当容器链接到通过 nginx 进行通信时 我只想使用 docker compose
  • Git 子模块未在 Jenkins 构建中更新

    我在詹金斯的一个项目中有一个子模块 我已启用高级设置以递归更新子模块 当我运行构建时 我看到工作区包含子模块中的文件 问题是 它似乎是子模块的第一个修订版 当我推送更改 托管在 GitHub 上的存储库 时 Jenkins 似乎没有更新子模
  • 如何将用户输入密码与凭据密码进行比较

    我有一个脚本化管道 它使用以下命令请求用户的密码input函数并将其与用户保存的凭据密码进行比较 如果用户输入的是一个类型string然后就可以了 但是 当我将输入类型更改为password 因此当用户键入它时 它在屏幕上不可见 它会失败并

随机推荐