Pyroscope

    1. vela port-forward addon-pyroscope -n vela-system
    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
    • 为了在 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. // AuthToken: os.Getenv("PYROSCOPE_AUTH_TOKEN"),
    10. // 默认启用所有的分析器,但是你也可以指定你想要启用的分析器:
    11. ProfileTypes: []pyroscope.ProfileType{
    12. pyroscope.ProfileCPU,
    13. pyroscope.ProfileAllocObjects,
    14. pyroscope.ProfileAllocSpace,
    15. pyroscope.ProfileInuseObjects,
    16. pyroscope.ProfileInuseSpace,
    17. },
    18. })
    19. // your code goes here
    20. }

    在 Java 应用中使用 Pyroscope

    • Java 集成是通过一个名叫 pyroscope.jar 的 jar 包分发的。它包含了原生的 async-profile 库。
    • 要开始分析一个 Java 应用,通过使用 pyroscope.jar 的 javaagent 来启动你的程序:
    • 要开始分析容器里的 .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. ASPNETCORE_URLS: http://*:5000
    15. ports:
    16. - "5000:5000"
    17. cap_add:
    18. - SYS_PTRACE

    在 Python 应用中使用 Pyroscope

    • 首先,安装 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. )
    • 要开始分析容器里的 PHP 应用,你需要用 pyroscope exec 来包装你的应用程序作为镜像的 entrypoint。你需要在你的 Dockerfile 中使用 COPY —from 将 pyroscope 可执行二进制拷贝到你的容器里。 下面的 Dockerfile 演示了如何构建这个镜像:
    • 如果你正在使用 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

    • 要在一个 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()