102.skywalking使用
# 01.go2sky
步骤 | 做了什么 | 为什么重要 |
---|---|---|
1. 初始化 Reporter | reporter.NewGRPCReporter("127.0.0.1:11800") | 创建了和 OAP Server 通讯的“上报通道” |
2. 创建 Tracer | go2sky.NewTracer("demo-app", ...) | 用于在代码中生成 trace(span)对象 |
3. 注入中间件(Gin 和 gRPC) | 创建 EntrySpan(追踪入口点) | 把 HTTP/gRPC 的每个请求都“变成一次 trace 的起点” |
4. 传递上下文(context) | WithContext(ctx) + go2sky.TraceID(ctx) | 保证 trace ID 能在整个请求生命周期中携带和记录 |
5. 上报数据 | SDK 自动把 span 数据打包,通过 reporter 发给 OAP | 最终 trace 会出现在 SkyWalking UI 中 |
package main
import (
"context"
"log"
"net"
"net/http"
"github.com/SkyAPM/go2sky"
"github.com/SkyAPM/go2sky/reporter"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
// gRPC 请求与响应结构(模拟 proto)
type EmptyRequest struct{}
type HelloReply struct {
Message string
}
// gRPC 服务实现
type GreeterServer struct{}
func (s *GreeterServer) SayHello(ctx context.Context, req *EmptyRequest) (*HelloReply, error) {
log.Printf("[gRPC Server] Hello Called - TraceID: %s", go2sky.TraceID(ctx))
return &HelloReply{Message: "Hello from gRPC"}, nil
}
func main() {
// 初始化 SkyWalking reporter
rep, err := reporter.NewGRPCReporter("127.0.0.1:11800")
if err != nil {
log.Fatalf("cannot create skywalking reporter: %v", err)
}
// 创建 tracer
tracer, err := go2sky.NewTracer("demo-app", go2sky.WithReporter(rep))
if err != nil {
log.Fatalf("cannot create tracer: %v", err)
}
// 并发启动 HTTP 和 gRPC 服务
go startGRPCServer(tracer)
startHTTPServer(tracer)
}
// HTTP Server 使用 Gin + SkyWalking 中间件
func startHTTPServer(tracer *go2sky.Tracer) {
r := gin.Default()
r.Use(func(c *gin.Context) {
span, ctx, err := tracer.CreateEntrySpan(c.Request.Context(), c.FullPath(), func(key string) (string, error) {
return c.Request.Header.Get(key), nil
})
if err == nil {
defer span.End()
c.Request = c.Request.WithContext(ctx)
}
c.Next()
})
r.GET("/hello", func(c *gin.Context) {
ctx := c.Request.Context()
traceID := go2sky.TraceID(ctx)
log.Printf("[HTTP] /hello called - TraceID: %s", traceID)
c.JSON(http.StatusOK, gin.H{"message": "Hello from Gin", "trace_id": traceID})
})
log.Println("[HTTP] Listening on :8080")
http.ListenAndServe(":8080", r)
}
// gRPC Server 使用 UnaryInterceptor 记录 trace
func startGRPCServer(tracer *go2sky.Tracer) {
interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
md, _ := metadata.FromIncomingContext(ctx)
carrier := make(map[string]string)
for k, v := range md {
if len(v) > 0 {
carrier[k] = v[0]
}
}
span, ctx, err := tracer.CreateEntrySpan(ctx, info.FullMethod, func(key string) (string, error) {
return carrier[key], nil
})
if err == nil {
defer span.End()
}
return handler(ctx, req)
}
server := grpc.NewServer(grpc.UnaryInterceptor(interceptor))
log.Println("[gRPC] Listening on :9090")
ln, err := net.Listen("tcp", ":9090")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 此处未注册 GreeterServer,为演示重点省略
go server.Serve(ln)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# 02.skywalking-python
# 1.0 参考
官网:https://skywalking.apache.org/docs/skywalking-python/v0.7.0/en/setup/intrusive/
包官网:https://pypi.org/project/apache-skywalking/
GitHub:https://github.com/apache/skywalking-python/tree/1d25b08c5a3d6b16719966406fec2c51291b0126
博客案例:https://blog.csdn.net/qq_30355341/article/details/114641498
flask使用skywalking:https://blog.csdn.net/qq_30355341/article/details/114641498
1
2
3
4
5
2
3
4
5
# 1.1 安装
- https://skywalking.apache.org/docs/skywalking-python/v0.7.0/en/setup/installation/
# Install the latest version, using the default gRPC protocol to report data to OAP
pip install "apache-skywalking"
# Install the latest version, using the http protocol to report data to OAP
pip install "apache-skywalking[http]"
# Install the latest version, using the kafka protocol to report data to OAP
pip install "apache-skywalking[kafka]"
# Install a specific version x.y.z
# pip install apache-skywalking==x.y.z
pip install apache-skywalking==0.1.0 # For example, install version 0.1.0 no matter what the latest version is
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 1.2 使用测试
- 只需在启动前初始化 skywalking的配置文件
- 官方文档:https://pypi.org/project/apache-skywalking/
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
from flask import request
from skywalking import agent, config
config.init(collector_address='192.168.56.65:11800', service_name='flask_test02')
agent.start()
agent.start()
app=Flask(__name__)
@app.route('/user/<name>') #设置url传参数 http://127.0.0.1:5000/user/zhangsan?name=aaa
def first_flask(name): #视图必须有对应接收参数
print(name) # zhangsan
print(request.form) # 获取post请求
print(request.values.get('name')) # 获取get请求中参数
print(request.args.get('name')) # 获取get请求中参数
return 'Hello World'
if __name__ == '__main__':
app.run(debug=True,port=8001)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上次更新: 2025/4/29 17:38:19