Giter Site home page Giter Site logo

otel_zero's Introduction

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
Loading

组件说明

  • 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"

	"github.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")
}

otel_zero's People

Contributors

himan000 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.