otel_zero

package module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 16, 2023 License: AGPL-3.0 Imports: 16 Imported by: 0

README

otel_zero

介绍

集合otel_zap_loggerzero_mdc_log。使用opentelemery产生trace,使用zerolog产生logtraceID在代码间的传递通过MDC(Mapped Diagnostic Context)进行传递,避免使用context进行传递, MDC是协程安全的。后续的tracelog可以发送到tempoloki,并且通过traceID可以在grafana显示tracelog的关联。本代码只包含tracelog的产生及发送,未包含promtailtempolokigrafana的安装部署。

软件架构
flowchart LR
otel_zap_logger --> trace
trace -- http --> tempo

zero_mdc_log --> log_file 
log_file -- promtail -->loki

tempo-->grafana
loki-->grafana
组件说明
  • Grafana 是一款采用 go 语言编写的开源应用,是一个跨平台的开源的度量分析和可视化工具。
  • Tempo 一个开源的、易于使用的、大规模的分布式跟踪服务端,支持常见的开源跟踪协议,包括JaegerZipkin Open Telemetry
  • Loki Loki 是一个受 Prometheus 启发的水平可扩展、高可用、多租户日志聚合系统(比Elastic简单,不索引日志内容)。
  • OpenTelemetry 一个简单的、高度可扩展的、高性能的日志追踪框架(准确来说是标准协议,本身不提供存储,需要其他组件支持比如 LokiJaegerPrometheusSkyWalking等)。
  • otel_zap_logger 一个opentelemetry-gozap日志的封装,此处只用到了opentelemetry
  • zero_mdc_log zerolog和MDC的封装。
使用说明

以下是使用的例子,作为参考。

main.go

package main

import (
	"net/http"
	"otel_zero_test/pkg/config"

	"gitee.com/Himan000/otel_zero"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
)

func main() {
	//项目配置
	c := config.New(viper.GetViper())
	_ = c.Load()

	// gin
	g := gin.Default()

	otel_zero.Init(g)            
	g.Use(otel_zero.SetLogger()) 

	g.GET("/ping", func(c *gin.Context) {
		otel_zero.Info().Msg("this is ping")
		otel_zero.NewReqeust("GET", "http://localhost:8082/pong", nil)
		c.JSON(http.StatusOK, gin.H{
			"message": "ping",
		})
	})

	g.GET("/pong", func(c *gin.Context) {
		otel_zero.Info().Msg("this is pong")
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})

	g.Run(":8081")
}

otel_zero_test/pkg/config/config.go

package config

import (
	"gitee.com/wxlao/config-client"
	"github.com/rs/zerolog/log"

	"github.com/spf13/viper"
)

// Config 配置
type Config struct {
	viper *viper.Viper
}

// New 新配置
func New(viper *viper.Viper) *Config {
	return &Config{
		viper: viper,
	}
}

// Load 加载配置
func (c *Config) Load() error {
	c.viper.SetConfigType("env")
    c.setDefault()

    // 可以将全局变量配置在.env文件里面(key=value),将覆盖setDefault的值。
	if err := config.LoadFile(".env"); err != nil {
		log.Error().Str("err", err.Error()).Msg("Error reading config file")
	}
    
	return nil
}

func (c *Config) setDefault() {
	c.viper.SetDefault("JAEGER_SERVER", "http://192.168.1.121:14268/api/traces") // 如果不配置将不能发送trace到tempo
    c.viper.SetDefault("APP_ID", "otel_zero_test")
}

Documentation

Index

Constants

View Source
const (
	POST = "POST"
	GET  = "GET"
)

Variables

This section is empty.

Functions

func AppendOtelHeader

func AppendOtelHeader(opts ...eureka.Option) []eureka.Option

func Debug

func Debug() *zerolog.Event

func Error

func Error() *zerolog.Event

func GetOutBoundIP added in v1.0.1

func GetOutBoundIP() (ip string, err error)

获取外网地址

func GetReqeustHeader

func GetReqeustHeader() map[string]string

调用链的请求包装。将traceid(context)相关注入otel

func Info

func Info() *zerolog.Event

func Init

func Init(r *gin.Engine)

入口otel、zero初始化,以及接收传入的gin参数(header/context)

func Log

func Log() *zero_mdc_log.Overlog

func LogContextMiddleware

func LogContextMiddleware(c *gin.Context)

* 将日志相关需要协程安全的信息放到MDC: 通过header传入MDC。 * 要使log能打印某个字段,需要两个条件:1. 将值设置在MDC;2. 初始化zero_log的时候将 * 字段加入到zero_log(AddGlobalFields)。

func MDC

func MDC() *zero_mdc_log.MdcAdapter

func NewReqeust

func NewReqeust(method, url string, body io.Reader) (*http.Response, error)

调用下一个请求时,将当前的MDC传入下一个请求。

func Panic

func Panic() *zerolog.Event

func SetLogger

func SetLogger(configItems ...zero_mdc_log.ConfigItem) gin.HandlerFunc

设置请求的middleware,每个请求写一些日志

Types

This section is empty.

Directories

Path Synopsis
log

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL