版本:v1.8

Pyroscope

Pyroscope 是一个开源平台,由服务器和代理组成。 它允许用户以 CPU 和磁盘高效的方式收集、存储和查询分析数据。这个插件基于 Pyroscope 构建。

  1. vela addon enable pyroscope

在成功启用 pyroscope 之后,你可以执行下面的命令来暴露4040端口以提供控制台界面访问。

  1. vela port-forward addon-pyroscope -n vela-system

使用一个 webservice 组件来开始,将下面的声明保存到 pyroscope-demo.yaml,并运行 vela up -f app-demo.yaml 来启动。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: pyroscope-app
  5. namespace: fourier
  6. spec:
  7. components:
  8. - name: pyroscope-comp-01
  9. type: webservice
  10. properties:
  11. image: nginx:latest
  12. ports:
  13. - expose: true
  14. port: 80
  15. protocol: TCP
  16. imagePullPolicy: IfNotPresent
  17. traits:
  18. - type: pyroscope
  19. properties:
  20. server: "http://pyroscope-server:9084"
  21. logger: "pyroscope.StandardLogger"
  22. appName: "pyroscope-test"
  23. - type: scaler
  24. properties:
  25. replicas: 1

appName参数是一个可选字段,默认值是这个组件的名字。

  • 为了在 Go 应用中启用分析,你需要在你的应用中导入 Pyroscope 模块。
  1. # make sure you also upgrade pyroscope server to version 0.3.1 or higher
  2. go get github.com/pyroscope-io/client/pyroscope
  • 然后,在你的应用中添加如下代码:
  1. package main
  2. import "github.com/pyroscope-io/client/pyroscope"
  3. func main() {
  4. pyroscope.Start(pyroscope.Config{
  5. ApplicationName: "simple.golang.app",
  6. // 将这个地址替换为你的 pyroscope 服务端地址
  7. ServerAddress: "http://pyroscope-server:4040",
  8. // 你可以通过设置值为 nil 来禁用日志
  9. Logger: pyroscope.StandardLogger,
  10. // 如果 pyroscope 服务端启用了认证,需要指定 API 密钥:
  11. // AuthToken: os.Getenv("PYROSCOPE_AUTH_TOKEN"),
  12. // 默认启用所有的分析器,但是你也可以指定你想要启用的分析器:
  13. ProfileTypes: []pyroscope.ProfileType{
  14. pyroscope.ProfileCPU,
  15. pyroscope.ProfileAllocObjects,
  16. pyroscope.ProfileAllocSpace,
  17. pyroscope.ProfileInuseObjects,
  18. pyroscope.ProfileInuseSpace,
  19. },
  20. })
  21. // your code goes here
  22. }
  • 查看 示例代码 目录来获取更多使用示例。

  • Java 集成是通过一个名叫 pyroscope.jar 的 jar 包分发的。它包含了原生的 async-profile 库。

  • 要开始分析一个 Java 应用,通过使用 pyroscope.jar 的 javaagent 来启动你的程序:
  1. export PYROSCOPE_APPLICATION_NAME=my.java.app
  2. export PYROSCOPE_SERVER_ADDRESS=http://pyroscope-server:4040
  3. # 如果 pyroscope 服务端启用了认证,需要指定 API 密钥:
  4. # export PYROSCOPE_AUTH_TOKEN={YOUR_API_KEY}
  5. java -javaagent:pyroscope.jar -jar app.jar
  • 查看 示例代码 目录来获取更多使用示例。

  • 要开始分析容器里的 .NET 应用,你需要用 pyroscope exec 来包装你的应用程序作为镜像的 entrypoint。你需要在你的 Dockerfile 中使用 COPY —from 将 pyroscope 可执行二进制拷贝到你的容器里。 下面的 Dockerfile 演示了如何构建这个镜像:

  1. FROM mcr.microsoft.com/dotnet/sdk:5.0
  2. WORKDIR /dotnet
  3. COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope
  4. ADD my-app .
  5. RUN dotnet publish -o . -r $(dotnet --info | grep RID | cut -b 6- | tr -d ' ')
  6. # 你可以像设置 pyroscope 服务地址一样设置其他的配置选项。
  7. ENV PYROSCOPE_SERVER_ADDRESS=http://pyroscope-server:4040
  8. ENV PYROSCOPE_APPLICATION_NAME=my.dotnet.app
  9. ENV PYROSCOPE_LOG_LEVEL=debug
  10. CMD ["pyroscope", "exec", "dotnet", "/dotnet/my-app.dll"]
  • 如果你正在使用 Docker Compose,那么你可以使用下面的配置同时运行 pyroscope 服务端和客户端。
  1. ---
  2. version: "3.9"
  3. services:
  4. pyroscope-server:
  5. image: "pyroscope/pyroscope:latest"
  6. ports:
  7. - "4040:4040"
  8. command:
  9. - "server"
  10. app:
  11. image: "my-app:latest"
  12. environment:
  13. PYROSCOPE_APPLICATION_NAME: my.dotnet.app
  14. PYROSCOPE_SERVER_ADDRESS: http://pyroscope-server:4040
  15. PYROSCOPE_LOG_LEVEL: debug
  16. ASPNETCORE_URLS: http://*:5000
  17. ports:
  18. - "5000:5000"
  19. cap_add:
  20. - SYS_PTRACE
  • 查看 示例代码 目录来获取更多使用示例。

  • 首先,安装 pyroscope-io 的 pip 包:

  1. pip install pyroscope-io
  • 然后在你的应用中添加下面的代码。这些代码将会初始化 pyroscope 分析器并且启动分析:
  1. import pyroscope
  2. pyroscope.configure(
  3. app_name = "my.python.app", # 将这里替换为你的应用名称
  4. server_address = "http://my-pyroscope-server:4040", # 将这个地址替换为你的 pyroscope 服务端地址
  5. # auth_token = "{YOUR_API_KEY}", # 如果 pyroscope 服务端启用了认证,需要指定 API 密钥
  6. )
  • 查看 pyroscope 仓库中的 python 项目中的 pyroscope 示例 来获取更多使用示例。

  • 要开始分析容器里的 PHP 应用,你需要用 pyroscope exec 来包装你的应用程序作为镜像的 entrypoint。你需要在你的 Dockerfile 中使用 COPY —from 将 pyroscope 可执行二进制拷贝到你的容器里。 下面的 Dockerfile 演示了如何构建这个镜像:

  1. FROM php:7.3.27
  2. WORKDIR /var/www/html
  3. # 这条命令从 pyroscope 镜像中拷贝 pyroscope 二进制文件到你的镜像
  4. COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope
  5. COPY main.php ./main.php
  6. # 通常你可以像设置 app name 一样来设置 pyroscope 服务端地址,请确保更新下面的配置:
  7. ENV PYROSCOPE_APPLICATION_NAME=my.php.app
  8. ENV PYROSCOPE_SERVER_ADDRESS=http://pyroscope:4040/
  9. # 通过下面的命令来启动一个带 pyroscope 分析器的应用程序,请务必修改 "php" 和 "main.php" 为实际的命令。
  10. CMD ["pyroscope", "exec", "php", "main.php"]
  • 如果你正在使用 Docker Compose,那么你可以使用下面的配置同时运行 pyroscope 服务端和客户端。
  1. ---
  2. services:
  3. pyroscope-server:
  4. image: "pyroscope/pyroscope:latest"
  5. ports:
  6. - "4040:4040"
  7. command:
  8. - "server"
  9. app:
  10. image: "my-app:latest"
  11. env:
  12. PYROSCOPE_SERVER_ADDRESS: http://pyroscope-server:4040
  13. PYROSCOPE_APPLICATION_NAME: my.php.app
  14. cap_add:
  15. - SYS_PTRACE
  • 查看 示例代码 目录来获取更多使用示例。

  • 要在一个 NodeJS 项目中启用 pyroscope 分析器,你需要使用 npm 来导入模块:

  1. npm install @pyroscope/nodejs
  2. # 或者
  3. yarn add @pyroscope/nodejs
  • 然后,在你的应用中添加下面的代码:
  1. const Pyroscope = require('@pyroscope/nodejs');
  2. Pyroscope.init({
  3. serverAddress: 'http://pyroscope:4040',
  4. appName: 'myNodeService'
  5. });
  6. Pyroscope.start()
  1. vela addon disable pyroscope

Last updated on 2023年5月6日 by Tianxin Dong