ECS에서만 xray-sdk-go가 움직이지 않는 원인과 해결 방법

10865 단어 5x-rayECS

무엇을하고 싶었습니까?


  • golang으로 만든 응용 프로그램에 APM을 넣고 싶었습니다
  • 환경은 ECS에서 움직이기 때문에 친화력을 고려하여 X-Ray를 사용하기로 선택했습니다.

    어떤 느낌으로 만들었습니까?


  • Application은 이런 느낌의 것을 상정
  • 패키지 관리는 mod를 이용
  • x-ray는 amazon/aws-xray-daemon을 이용
  • ECS에서 호스트 지정은 AWS_XRAY_DAEMON_ADDRESS를 지정
  • 구체적인 코드는 이런 느낌

  • main.go
    package main
    
    import (
        "github.com/gin-gonic/gin"
        apm "project/apm"
    )
    
    // GinRouter is router that API method router.
    func main() {
        router := gin.Default()
    
        // helth check
        router.GET("/helth", func(c *gin.Context) {
            apm.TraceSeg(c, "/helth")
    
            c.JSON(200, gin.H{
                    "message": "helth check ok",
            })
        })
    
        // other URI
        // ...
    
        router.Run(":8080")
    }
    

    apm.go
    package main
    
    import (
        "context"
        "github.com/aws/aws-xray-sdk-go/xray"
        _ "github.com/aws/aws-xray-sdk-go/plugins/ecs"
    )
    
    func TraceSeg(c context.Context, service string) (*context.Context) {
        ctx, seg := xray.BeginSegment(c, service)
        seg.Close(nil)
    
        return &ctx
    }
    
    func TraceSubSeg(c context.Context, service string) (*context.Context) {
        ctx, subSeg := xray.BeginSubsegment(c, service)
        subSeg.Close(nil)
    
        return &ctx
    }
    

    task_difinition
    version: '2'
    services:
        api:
            image: xxxxx:${CI_BUILD_REF}
            mem_limit: xxxxMB
            cpu_shares: xxxx
            ports:
                - "0:8080"
            links:
                - xray-daemon
            environment:
                AWS_REGION: xxxx
                AWS_XRAY_DAEMON_ADDRESS: "xray-daemon:2000"
                SERVICE: xxxxx
            logging:
                driver: "awslogs"
                options:
                    awslogs-region: "ap-northeast-1"
                    awslogs-group: "xxxxx"
                    awslogs-create-group: "true"
        xray-daemon:
            image: amazon/aws-xray-daemon
            hostname: xray-deamon
            mem_limit: xxxxB 
            cpu_shares: xx
            ports:
                - "2000:2000/udp"
            environment:
                AWS_REGION: xxxxx
    

    무슨 일이야?


  • local에서 테스트했을 때 → 움직였다
  • docker on EC2 → 움직였다

  • ECS → 움직이지 않았다
    [Trace] Beginning segment named /helth 
    [Trace] Closing segment named /helth 
    [Error] write udp 127.0.0.1:52419->127.0.0.1:2000: write: connection refused 
    

    ※ ENV나 process에는 변수는 전달되고 있었다
  • # EC2で動いているdocker processに変数が渡されているかの確認
    [ec2-user@ip-172-28-22-74 ~]$ sudo sed "s/\x0/\n/g" /proc/5351/environ 
    ~
    AWS_XRAY_DAEMON_ADDRESS=xray-daemon:2000 
    ~
    
    # run している containerから変数は見れるか
    root@559381b52506:/# env 
    GOLANG_VERSION=1.12.1 
    ~
    AWS_XRAY_DAEMON_ADDRESS=xray-daemon:2000 
    ~
    

    왜 움직이지 않니?



    AWS에 문의하면 AWS X-Ray SDK for Go의 1.0.0-rc.8 이전 버전에서도 유사한 이벤트가 발생할 수 있습니다.

    확인해보기



    mod를 이용하여 버전 관리하고 있으므로, mod의 내용을 보자
    $ cat go.mod | grep xray 
    github.com/aws/aws-xray-sdk-go v0.9.4 
    

    → 「v0.9.4」를 이용하고 있다

    go get -u로 버전 업 해 보자.
    $ go clean -cache
    $ go get -u github.com/aws/aws-xray-sdk-go
    ↓
    $ go build
    $ grep xray go.mod 
            github.com/aws/aws-xray-sdk-go v0.9.4
    

    → 변하지 않는다 ...

    git commit 확인
    $ cd $GOPATH/src/github.com/aws/aws-xray-sdk-go
    $ git log -1
    commit 5ffa743a8b8db87a9d4449c2f63fe95a4a53a8c5 (HEAD -> master, origin/master, origin/HEAD)
    Author: Christopher Radek <[email protected]>
    Date:   Tue Apr 9 13:59:20 2019 -0700
    
        upkeep: adds -race to travis test scripts (#104)
    


    → 일치했다. 라고 하는 것은 최신 버젼은 잡혀 있을 것.

    왜 mod에서 "1.0.0-rc.x"가 지정되지 않는가?



    A. 사소한 버전이기 때문에

    마이너 버전을 이용하는 경우는 직접 mod를 편집해 줄 필요가 있는 모양
    [before]
    $ cat go.mod | grep xray 
    github.com/aws/aws-xray-sdk-go v0.9.4 
    
    [after]
    $ cat go.mod | grep xray 
    github.com/aws/aws-xray-sdk-go v1.0.0-rc.11
    
    # こんな感じに動く
    $ go build
    go: finding github.com/aws/aws-xray-sdk-go v1.0.0-rc.11
    go: finding github.com/aws/aws-sdk-go v1.17.12
    go: finding github.com/stretchr/testify v1.1.4
    go: finding github.com/davecgh/go-spew v0.0.0-20160907170601-6d212800a42e
    go: finding github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0
    go: finding github.com/DATA-DOG/go-sqlmock v1.2.0
    go: finding golang.org/x/text v0.0.0-20190306152657-5d731a35f486
    go: finding golang.org/x/net v0.0.0-20190301231341-16b79f2e4e95
    go: finding golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e
    go: downloading github.com/aws/aws-xray-sdk-go v1.0.0-rc.11
    go: extracting github.com/aws/aws-xray-sdk-go v1.0.0-rc.11
    

    요약


  • xray-sdk-go를 사용하여 APM을 ECS에 올릴 때 버전에주의하십시오
  • mod를 사용하는 경우 수동으로 마이너 버전으로 전환합시다
  • 좋은 웹페이지 즐겨찾기