当前位置:网站首页>Goframe framework: add tracing Middleware
Goframe framework: add tracing Middleware
2022-06-23 18:00:00 【Trespass 】
Introduce
Through a complete example , Based on gogf/gf Add call chain to microservice (Tracing) middleware .
What is a call chain (Tracing) middleware ?
Call chain (Tracing) Middleware will be used for every API Request record Tracing data , Users can use something like Jaeger Tool View .
We will use rk-boot To start up gogf/gf Microservices .
rk-boot It's a pass through YAML Start multiple Web Service framework . Please refer to the last chapter of this article , understand rk-boot details .
Please visit the following address for a complete tutorial :https://rkdocs.netlify.app/cn
install
go get github.com/rookie-ninja/rk-boot/gf
Quick start
rk-boot By default OpenTelemetry-CNCF To deal with it Tracing.
1. establish boot.yaml
In order to verify , We launched the following options :
- commonService:commonService It contains a series of general API. details
- jaeger exporter:gogf/gf The service will be delivered locally jaeger agent send data .
---
gf:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
commonService:
enabled: true # Optional, default: false
interceptors:
tracingTelemetry:
enabled: true # Optional, Enable tracing interceptor/middleware
exporter:
jaeger:
agent:
enabled: true # Optional, Export to jaeger agent2. establish main.go
add to /v1/greeter API.
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"fmt"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/rookie-ninja/rk-boot"
"github.com/rookie-ninja/rk-boot/gf"
"net/http"
)
// Application entrance.
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
// Register handler
gfEntry := rkbootgf.GetGfEntry("greeter")
gfEntry.Server.BindHandler("/v1/greeter", func(ctx *ghttp.Request) {
ctx.Response.WriteHeader(http.StatusOK)
ctx.Response.WriteJson(&GreeterResponse{
Message: fmt.Sprintf("Hello %s!", ctx.GetQuery("name")),
})
})
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}
type GreeterResponse struct {
Message string
}3. Folder structure
$ tree . ├── boot.yaml ├── go.mod ├── go.sum └── main.go 0 directories, 4 files
4. Local boot jaeger
$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.235. start-up main.go
$ go run main.go
6. verification
- Send a request to CommonService Inside /rk/v1/healthy API.
$ curl -X GET localhost:8080/rk/v1/healthy
{"healthy":true}- Send a request to /v1/greeter API.
curl -X GET "localhost:8080/v1/greeter?name=rk-dev"
{"Message":"Hello rk-dev!"}- visit jaeger Home page : http://localhost:16686/
Not through rkentry.GlobalAppCtx.GetAppInfoEntry().AppName Appoint AppName Under the circumstances , By default rk As AppName.
Output to Stdout
It can be modified by boot.yaml File to modify the output path , such as STDOUT.
- boot.yaml
---
gf:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
commonService:
enabled: true # Optional, default: false
interceptors:
tracingTelemetry:
enabled: true # Optional, Enable tracing interceptor/middleware
exporter:
file:
enabled: true
outputPath: "stdout" # Optional, Output to stdoutoutput to a file
It can be modified by boot.yaml File to save Tracing Information to file .
- boot.yaml
---
gf:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
commonService:
enabled: true # Optional, default: false
interceptors:
tracingTelemetry:
enabled: true # Optional, Enable tracing interceptor/middleware
exporter:
file:
enabled: true
outputPath: "logs/tracing.log" # Optional, Log to filesYAML Options
name | describe | type | The default value is |
|---|---|---|---|
gf.interceptors.tracingTelemetry.enabled | Start the call chain interceptor | boolean | false |
gf.interceptors.tracingTelemetry.exporter.file.enabled | Start file output | boolean | false |
gf.interceptors.tracingTelemetry.exporter.file.outputPath | Output file path | string | stdout |
gf.interceptors.tracingTelemetry.exporter.jaeger.agent.enabled | jaeger agent Output as data | boolean | false |
gf.interceptors.tracingTelemetry.exporter.jaeger.agent.host | jaeger agent Address | string | localhost |
gf.interceptors.tracingTelemetry.exporter.jaeger.agent.port | jaeger agent port | int | 6831 |
gf.interceptors.tracingTelemetry.exporter.jaeger.collector.enabled | jaeger collector Output as data | boolean | false |
gf.interceptors.tracingTelemetry.exporter.jaeger.collector.endpoint | jaeger collector Address | string | http://localhost:16368/api/trace |
gf.interceptors.tracingTelemetry.exporter.jaeger.collector.username | jaeger collector user name | string | "" |
gf.interceptors.tracingTelemetry.exporter.jaeger.collector.password | jaeger collector password | string | "" |
rk-boot Introduce
rk-boot It's a pass through YAML Start multiple Web Service framework .
It's kind of like Spring boot. Through integration rk-xxx Series Library , Can start a variety of Web frame . Of course , Users can also customize rk-xxx The library is integrated into rk-boot in .
rk-boot Bright spot
Through the same format YAML file , Start different Web frame .
such as , We can use the following documents , Start simultaneously in one process gRPC, Gin, Echo, GoFrame frame . Unify the micro service layout within the team .
- Dependent installation
go get github.com/rookie-ninja/rk-boot/grpc go get github.com/rookie-ninja/rk-boot/gin go get github.com/rookie-ninja/rk-boot/echo go get github.com/rookie-ninja/rk-boot/gf
- boot.yaml
---
grpc:
- name: grpc-server
port: 8080
enabled: true
gin:
- name: gin-server
port: 8081
enabled: true
echo:
- name: echo-server
port: 8082
enabled: true
gf:
- name: gf-server
port: 8083
enabled: true- main.go
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"github.com/rookie-ninja/rk-boot"
_ "github.com/rookie-ninja/rk-boot/echo"
_ "github.com/rookie-ninja/rk-boot/gf"
_ "github.com/rookie-ninja/rk-boot/gin"
_ "github.com/rookie-ninja/rk-boot/grpc"
)
// Application entrance.
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}- verification
# gRPC throuth grpc-gateway
$ curl localhost:8080/rk/v1/healthy
{"healthy":true}
# Gin
$ curl localhost:8081/rk/v1/healthy
{"healthy":true}
# Echo
$ curl localhost:8082/rk/v1/healthy
{"healthy":true}
# GoFrame
$ curl localhost:8083/rk/v1/healthy
{"healthy":true}rk-boot Supported by Web frame
Welcome to contribute new Web Frame to rk-boot In the series .
Reference resources docs & rk-gin As an example .
frame | Development status | install | rely on |
|---|---|---|---|
Stable | go get github.com/rookie-ninja/rk-boot/gin | ||
Stable | go get github.com/rookie-ninja/rk-boot/grpc | ||
Stable | go get github.com/rookie-ninja/rk-boot/echo | ||
Stable | go get github.com/rookie-ninja/rk-boot/gf | ||
Testing | go get github.com/rookie-ninja/rk-boot/fiber | ||
Testing | go get github.com/rookie-ninja/rk-boot/zero | ||
Testing | go get github.com/rookie-ninja/rk-boot/mux |
rk-gf Introduce
rk-gf Used by YAML start-up gogf/gf Web service .
Supported features
according to YAML The file initializes the following example , If it's external , Keep the original usage .
example | Introduce |
|---|---|
ghttp.Server | Native gogf/gf |
Config | Native spf13/viper Parameter instance |
Logger | Native uber-go/zap Log instance |
EventLogger | Used to record RPC Request log , Use rk-query |
Credential | For remote services , for example ETCD Pull Credential |
Cert | From remote service (ETCD wait ) In order to get TLS/SSL certificate , And start the SSL/TLS |
Prometheus | start-up Prometheus client , And push it to pushgateway |
Swagger | Local boot Swagger UI |
CommonService | Exposure general API |
TV | TV Webpage , Show the basic information of microservices |
StaticFileHandler | start-up Web Form of static file download service , Background storage supports local file systems and pkger. |
Supported middleware
rk-gf Will be based on YAML File initialization middleware .
Middleware | Description |
|---|---|
Metrics | collect RPC Metrics, And start the prometheus |
Log | Use rk-query Record each RPC journal |
Trace | collect RPC Call chain , And send data to stdout, Local files or jaeger open-telemetry/opentelemetry-go. |
Panic | Recover from panic for RPC requests and log it. |
Meta | Collect service meta information , Add to return Header in |
Auth | Support Basic Auth & API Key Verification middleware |
RateLimit | RPC Speed limiting middleware |
Timeout | RPC Timeout |
CORS | CORS middleware |
JWT | JWT verification |
Secure | Server side security middleware |
CSRF | CSRF middleware |
GoFrame complete YAML To configure
---
#app:
# description: "this is description" # Optional, default: ""
# keywords: ["rk", "golang"] # Optional, default: []
# homeUrl: "http://example.com" # Optional, default: ""
# iconUrl: "http://example.com" # Optional, default: ""
# docsUrl: ["http://example.com"] # Optional, default: []
# maintainers: ["rk-dev"] # Optional, default: []
#zapLogger:
# - name: zap-logger # Required
# description: "Description of entry" # Optional
#eventLogger:
# - name: event-logger # Required
# description: "Description of entry" # Optional
#cred:
# - name: "local-cred" # Required
# provider: "localFs" # Required, etcd, consul, localFs, remoteFs are supported options
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# paths: # Optional
# - "example/boot/full/cred.yaml"
#cert:
# - name: "local-cert" # Required
# provider: "localFs" # Required, etcd, consul, localFs, remoteFs are supported options
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# serverCertPath: "example/boot/full/server.pem" # Optional, default: "", path of certificate on local FS
# serverKeyPath: "example/boot/full/server-key.pem" # Optional, default: "", path of certificate on local FS
# clientCertPath: "example/client.pem" # Optional, default: "", path of certificate on local FS
# clientKeyPath: "example/client.pem" # Optional, default: "", path of certificate on local FS
#config:
# - name: rk-main # Required
# path: "example/boot/full/config.yaml" # Required
# locale: "*::*::*::*" # Required, default: *::*::*::*
# description: "Description of entry" # Optional
gf:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
# description: "greeter server" # Optional, default: ""
# cert:
# ref: "local-cert" # Optional, default: "", reference of cert entry declared above
# sw:
# enabled: true # Optional, default: false
# path: "sw" # Optional, default: "sw"
# jsonPath: "" # Optional
# headers: ["sw:rk"] # Optional, default: []
# commonService:
# enabled: true # Optional, default: false
# static:
# enabled: true # Optional, default: false
# path: "/rk/v1/static" # Optional, default: /rk/v1/static
# sourceType: local # Required, options: pkger, local
# sourcePath: "." # Required, full path of source directory
# tv:
# enabled: true # Optional, default: false
# prom:
# enabled: true # Optional, default: false
# path: "" # Optional, default: "metrics"
# pusher:
# enabled: false # Optional, default: false
# jobName: "greeter-pusher" # Required
# remoteAddress: "localhost:9091" # Required
# basicAuth: "user:pass" # Optional, default: ""
# intervalMs: 10000 # Optional, default: 1000
# cert: # Optional
# ref: "local-test" # Optional, default: "", reference of cert entry declared above
# logger:
# zapLogger:
# ref: zap-logger # Optional, default: logger of STDOUT, reference of logger entry declared above
# eventLogger:
# ref: event-logger # Optional, default: logger of STDOUT, reference of logger entry declared above
# interceptors:
# loggingZap:
# enabled: true # Optional, default: false
# zapLoggerEncoding: "json" # Optional, default: "console"
# zapLoggerOutputPaths: ["logs/app.log"] # Optional, default: ["stdout"]
# eventLoggerEncoding: "json" # Optional, default: "console"
# eventLoggerOutputPaths: ["logs/event.log"] # Optional, default: ["stdout"]
# metricsProm:
# enabled: true # Optional, default: false
# auth:
# enabled: true # Optional, default: false
# basic:
# - "user:pass" # Optional, default: []
# ignorePrefix:
# - "/rk/v1" # Optional, default: []
# apiKey:
# - "keys" # Optional, default: []
# meta:
# enabled: true # Optional, default: false
# prefix: "rk" # Optional, default: "rk"
# tracingTelemetry:
# enabled: true # Optional, default: false
# exporter: # Optional, default will create a stdout exporter
# file:
# enabled: true # Optional, default: false
# outputPath: "logs/trace.log" # Optional, default: stdout
# jaeger:
# agent:
# enabled: false # Optional, default: false
# host: "" # Optional, default: localhost
# port: 0 # Optional, default: 6831
# collector:
# enabled: true # Optional, default: false
# endpoint: "" # Optional, default: http://localhost:14268/api/traces
# username: "" # Optional, default: ""
# password: "" # Optional, default: ""
# rateLimit:
# enabled: false # Optional, default: false
# algorithm: "leakyBucket" # Optional, default: "tokenBucket"
# reqPerSec: 100 # Optional, default: 1000000
# paths:
# - path: "/rk/v1/healthy" # Optional, default: ""
# reqPerSec: 0 # Optional, default: 1000000
# jwt:
# enabled: true # Optional, default: false
# signingKey: "my-secret" # Required
# ignorePrefix: # Optional, default: []
# - "/rk/v1/tv"
# - "/sw"
# - "/rk/v1/assets"
# signingKeys: # Optional
# - "key:value"
# signingAlgo: "" # Optional, default: "HS256"
# tokenLookup: "header:<name>" # Optional, default: "header:Authorization"
# authScheme: "Bearer" # Optional, default: "Bearer"
# secure:
# enabled: true # Optional, default: false
# xssProtection: "" # Optional, default: "1; mode=block"
# contentTypeNosniff: "" # Optional, default: nosniff
# xFrameOptions: "" # Optional, default: SAMEORIGIN
# hstsMaxAge: 0 # Optional, default: 0
# hstsExcludeSubdomains: false # Optional, default: false
# hstsPreloadEnabled: false # Optional, default: false
# contentSecurityPolicy: "" # Optional, default: ""
# cspReportOnly: false # Optional, default: false
# referrerPolicy: "" # Optional, default: ""
# ignorePrefix: [] # Optional, default: []
# csrf:
# enabled: true
# tokenLength: 32 # Optional, default: 32
# tokenLookup: "header:X-CSRF-Token" # Optional, default: "header:X-CSRF-Token"
# cookieName: "_csrf" # Optional, default: _csrf
# cookieDomain: "" # Optional, default: ""
# cookiePath: "" # Optional, default: ""
# cookieMaxAge: 86400 # Optional, default: 86400
# cookieHttpOnly: false # Optional, default: false
# cookieSameSite: "default" # Optional, default: "default", options: lax, strict, none, default
# ignorePrefix: [] # Optional, default: []边栏推荐
- 解答01:Smith圆为什么能“上感下容 左串右并”?
- [JS reverse hundred examples] pedata encryption information and zlib Application of gunzipsync()
- Analysis of three battery capacity monitoring schemes
- High availability solution practice of mongodb advanced applications (4)
- How to design a seckill system?
- Nodejs implements multi process
- MySQL installation, configuration and uninstall
- Hapoxy cluster service setup
- Single fire wire design series article 10: expanding application - single fire switch realizes double control
- Add new members to the connector family! Scenario connector helps enterprises comprehensively improve the operational efficiency of business systems
猜你喜欢

Date selection of hotel check-in time and check-out time

论文阅读 (55):Dynamic Multi-Robot Task Allocation under Uncertainty and Temporal Constraints

How important is 5g dual card dual access?

Wechat applet: time selector for the estimated arrival date of the hotel

MySQL transaction and its characteristics and locking mechanism

美团三面:聊聊你理解的Redis主从复制原理?

数据库 实验二 查询
![[qsetting and.Ini configuration files] and [create resources.qrc] in QT](/img/67/85a5e7f6ad4220600acd377248ef46.png)
[qsetting and.Ini configuration files] and [create resources.qrc] in QT

JSON - learning notes (message converter, etc.)
![[30. concatenate substrings of all words]](/img/e7/453c8524a23fbb7501e85140547ce1.png)
[30. concatenate substrings of all words]
随机推荐
Thymeleaf - learning notes
How to design a seckill system - geek course notes
. Net cloud native architect training camp (responsibility chain mode) -- learning notes
【30. 串联所有单词的子串】
解答02:Smith圆为什么能“上感下容 左串右并”?
论文阅读 (57):2-hydr_Ensemble: Lysine 2-Hydroxyisobutyrylation Identification with Ensemble Method (任务)
Easyplayer mobile terminal plays webrtc protocol for a long time. Pressing the play page cannot close the "about us" page
Establishment and use of SSL VPN (OpenVPN)
Redis ubuntu18.04.6 intranet deployment
What does the timestamp 90K mean?
Which securities company is good for opening a mobile account? Is online account opening safe?
手机开户流程是什么?现在网上开户安全么?
12. Manage network environment
What is the problem with TS File Error 404 when easynvr plays HLS protocol?
How to make towel washing label
如何通过线上股票开户?在线开户安全么?
Analysis of object class structure in Nanny level teaching (common class) [source code attached]
论文阅读 (55):Dynamic Multi-Robot Task Allocation under Uncertainty and Temporal Constraints
How to choose an account opening broker? Is it safe to open an account online now?
Nodejs implements multi process