Внутренняя трассировка Redis, Mon go или исходящего вызова Http не отображается в кибане - PullRequest
0 голосов
/ 04 мая 2020

Я реализовал небольшой код 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))
}
...