不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Java基础

  • 面向对象

  • Java进阶

  • Web基础

  • Spring框架

  • 微服务

    • 01.微服务介绍
    • 02.Eureka注册中心
    • 03.Ribbon负载均衡
    • 04.Hystrix熔断
    • 05.Turbine监控
    • 06.ZUUL网关
    • 07.Config配置中心
    • 100.Skywalking调用链
    • 101.skywalking安装
    • 102.skywalking使用
      • 01.go2sky
      • 02.skywalking-python
        • 1.0 参考
        • 1.1 安装
        • 1.2 使用测试
    • 110.ServiceMesh
  • Java
  • 微服务
xiaonaiqiang
2021-12-01
目录

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

# 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

# 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

# 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
上次更新: 2025/4/29 17:38:19
101.skywalking安装
110.ServiceMesh

← 101.skywalking安装 110.ServiceMesh→

最近更新
01
06.Mage平台
05-30
02
16.区块链交易所
05-28
03
01.常识梳理
05-28
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式