Я реализовал небольшой код po c для измерения среднего времени, затрачиваемого на каждый запрос. В коде я намерен позвонить mon go, redis и другим вызовам внешних служб из моего кода. Код, который я реализовал, находится в go, и я использую * Библиотека 1061 * gin- goni c и я внедрили в нее промежуточное ПО APM . Я также выполнил целую настройку elk в своем локальном через docker -compose и в этом asticsearch , APM , kibana все контейнеры работают нормально, и они могут отображать панель мониторинга для моих вызовов, но проблема, с которой я сталкиваюсь, заключается в том, что я не получаю их внутренние распределенные следы вызова в его apm kibana приборной панели, т. е. (сколько каждый получает или устанавливает внутри Redis занимает время или пн go вставка занимает время или мой исходящий сервисный звонок требует времени. Так что кто-то может сказать мне, где я делаю неправильно или что я пропускаю в коде.
Я использовал эту документацию для справки:
Инструментальный модуль для настройки агента Apm с go
Мне нужна такая панель управления
Пример распределенной трассировки журнала Pi c Kibana
но я получаю только столько
Этот вид отслеживания я получаю при каждом вызове
Вот мой Docker -Compose.yml
version: '3.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
ports:
- 9201:9201
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
ports:
- 9202:9202
networks:
- elastic
kib01:
image: docker.elastic.co/kibana/kibana:7.6.2
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
apm:
build:
context: .
dockerfile: apm.docker
container_name: apm
ports:
- 8200:8200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
```
вот мой apm. docker file
COPY apm-server.yml /usr/share/apm-server/apm-server.yml
USER root
RUN chown root:apm-server /usr/share/apm-server/apm-server.yml
USER apm-server
вот мой gin_poc_client. go file
package main
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gomodule/redigo/redis"
"go.elastic.co/apm"
"go.elastic.co/apm/module/apmgin"
"go.elastic.co/apm/module/apmhttp"
"go.elastic.co/apm/module/apmmongo"
"go.elastic.co/apm/module/apmredigo"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"io/ioutil"
"net/http"
)
func main() {
r := gin.New()
r.Use(apmgin.Middleware(r))
gin.SetMode(gin.DebugMode)
redisPool:=&redis.Pool{
// Maximum number of idle connections in the pool.
MaxIdle: 80,
// max number of connections
MaxActive: 12000,
// Dial is an application supplied function for creating and
// configuring a connection.
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
panic(err.Error())
}
return c, err
},
}
r.GET("/redis/set", func(c *gin.Context) {
conn := apmredigo.Wrap(redisPool.Get()).WithContext(c)
defer conn.Close()
//err := client.Set("Hey", "hey100", 0).Err()
_, err := conn.Do("SET", "hey5","hey500")
if err != nil {
panic(err)
}
c.JSON(200, gin.H{"Hey": "hey100"})
})
r.GET("/redis/get", func(c *gin.Context) {
conn := apmredigo.Wrap(redisPool.Get()).WithContext(c)
defer conn.Close()
val, err := conn.Do("GET", "hey5")
if err != nil {
panic(err)
}
fmt.Println("key", val)
c.JSON(200, gin.H{"get": val})
})
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.GET("/hello/supratim", func(c *gin.Context) {
span, ctx := apm.StartSpan(c, "main", "custom")
fmt.Println("Starting APM Spanning")
defer span.End()
request,err := http.NewRequest("GET", "http://localhost:8001/hello/supratim", nil)
if err!=nil{
fmt.Println("ERROR IS",err)
}
client := apmhttp.WrapClient(http.DefaultClient)
fmt.Println("Wrapping APM Http",client)
result, err1 := client.Do(request.WithContext(ctx))
if err1!=nil{
fmt.Println("ERROR in client request",err1)
}
body,err2 := ioutil.ReadAll(result.Body)
if err2 !=nil{
fmt.Println("ERROR IN BODY",err2)
}
fmt.Println("result ", string(body))
c.JSON(200, gin.H{
"message": string(body),
})
})
var mongoClient, _ = mongo.Connect(
context.Background(),
options.Client().SetMonitor(apmmongo.CommandMonitor()),
)
var collection *mongo.Collection
r.GET("/mongo/ping",func(c *gin.Context) {
collection = mongoClient.Database("dbAPM").Collection("poc")
_, err := collection.Find(c, bson.D{})
if err!=nil{
fmt.Println("Error",err)
}
c.JSON(200, gin.H{
"message": "pong",
})
})
r.GET("/mongo/insert",func(c *gin.Context) {
collection = mongoClient.Database("dbAPM").Collection("poc")
result, err := collection.InsertOne(c, bson.M{"foo": "bar1", "hello": "world1", "pi": 3.14159})
fmt.Println("RESULT IS",result)
if err!=nil{
fmt.Println("Error",err)
c.JSON(200, gin.H{
"message": err,
})
}
c.JSON(200, gin.H{
"message": result,
})
})
r.Run(":8000")
}
вот мой файл gin_poc_server. go для исходящего звонка из файла gin_poc_client
package main
import (
"fmt"
"github.com/gorilla/mux"
"go.elastic.co/apm/module/apmgorilla"
"log"
"net/http"
)
func helloHandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Hello, %s!\n", mux.Vars(req)["name"])
}
func main() {
r := mux.NewRouter()
r.Use(apmgorilla.Middleware())
r.HandleFunc("/hello/{name}", helloHandler)
log.Fatal(http.ListenAndServe(":8001", r))
}