Mackerel-agent의 AWS 포인트 주변에 있는 소스 코드(주로 Custom Identifier)

16013 단어 GoMackerel
자필

벚꽃구름과 맥켈의 콜라보레이션 도구'sackerel가 구현됐을 때의 노트.
mackerel-agent의 0.34.0으로 AWS 포인트를 진행할 수 있다.
자세한 내용은 블로그 8월 19일 보도에 있습니다.
대리 쪽에서 포인트를 어떻게 주는지 신경 쓰여서 조사했습니다.
다음은 집필 당시 마스터지부의 최신 제출(cd6a67a)을 토대로 조사한다.
향후 개발에 따라 처리 방법이 변경될 가능성이 있다.

호스트 정보 수집 (command/command.go)


아래에 유사한 것이 있다.
참조 소스: command/command.go#L472
command/command.go
// collectHostSpecs collects host specs (correspond to "name", "meta", "interfaces" and "customIdentifier" fields in API v0)
func collectHostSpecs() (string, map[string]interface{}, []spec.NetInterface, string, error) {
    // (省略)

    // 479行目〜
    cGen := spec.SuggestCloudGenerator()

    // (省略)

    // 485行目〜
    var customIdentifier string
    if cGen != nil {
        customIdentifier, err = cGen.SuggestCustomIdentifier()
        if err != nil {
            logger.Warningf("Error while suggesting custom identifier. err: %s", err.Error())
        }
    }

    // (省略)
collectHostSpecs()는 Mackerel 에이전트가 호스트 정보를 수집하는 도구입니다.
이 중에서 CustomIdentifire라는 값을 수집하기 위해spec.SuggestCloudGenerator()라고 부른다.
이 녀석SuggestCustomIdentifier() 나한테 돌려주는 것 같아CustomIdentifier.CustomIdentifire 매뉴얼 등에 기재되지 않았지만 Mackerel의 호스트 ID와 다르다
이 필드는 모든 ID를 소유하는 데 사용되는 필드입니다.GET /api/v0/hosts와 같은 호스트 정보 참조 API의 응답에도 올바른 값이 포함되어 있습니다.
그럼 불려온 곳spec.SuggestCloudGenerator()을 살펴봅시다.

각 클라우드 사업자에 Custom Identifire(spec/cloug.go) 생성


참조 소스: spec/cloud.go#L47
spec/cloud.go
// SuggestCloudGenerator returns suitable CloudGenerator
func SuggestCloudGenerator() *CloudGenerator {
    if isEC2() {
        return &CloudGenerator{&EC2Generator{ec2BaseURL}}
    }
    if isGCE() {
        return &CloudGenerator{&GCEGenerator{gceMetaURL}}
    }

    return nil
}
생성 생성기CustomIdentifire의 공장 방법을 만들고 되돌려줍니다.
여기에 isEC2() 또는 isGCE()를 통해 플랫폼을 판정하고 적당한 생성기를 제작한다.
대응하는 클라우드 플랫폼을 늘리고 싶다면 여기는 추가 대응!
과거의 근원 Digital Ocean에 대응하는 잔해가 있음)
참조 소스: spec/cloud.go#L59
spec/cloug.do
func isEC2() bool {
    cl := http.Client{
        Timeout: timeout,
    }
    // '/ami-id` is may be aws specific URL
    // (筆者注 : ec2BaseURL := "http://169.254.169.254/latest/meta-data")
    resp, err := cl.Get(ec2BaseURL.String() + "/ami-id")
    if err != nil {
        return false
    }
    defer resp.Body.Close()

    return resp.StatusCode == 200
}
판정메타데이터을 받다.
EC2 여부에 대한 판단에서는 요청/ami-id을 통해 OpenStack 등과 구별된다.
실제CustomIdentifire 생성 처리는 다음과 같다.
참조 소스: spec/cloud.go#L156
spec/cloud.go
// SuggestCustomIdentifier suggests the identifier of the EC2 instance
func (g *EC2Generator) SuggestCustomIdentifier() (string, error) {
    client := http.Client{Timeout: timeout}
    key := "instance-id"
    resp, err := client.Get(g.baseURL.String() + "/" + key)

    // (省略)

    instanceID := string(body)

    // (省略)

    return instanceID + ".ec2.amazonaws.com", nil
}
메타데이터에서만 인스턴스 ID를 가져와 반환インスタンスID.ec2.amazonaws.com합니다.
AWS와 GCE 외에 클라우드 플랫폼도 설치해야 한다.
수집된 CustomIdentifier는 아래에서 Mackerel에 전송됩니다.

호스트 정보 등록


참조 소스: command/command.go#L29
command/command.go

// prepareHost collects specs of the host and sends them to Mackerel server.
// A unique host-id is returned by the server if one is not specified.
func prepareHost(conf *config.Config, api *mackerel.API) (*mackerel.Host, error) {
    // (省略)

            // (66行目〜)
            doRetry(func() error {
                hostID, lastErr = api.CreateHost(mackerel.HostSpec{
                    Name:             hostname,
                    Meta:             meta,
                    Interfaces:       interfaces,
                    RoleFullnames:    conf.Roles,
                    DisplayName:      conf.DisplayName,
                    CustomIdentifier: customIdentifier,
                })
                return filterErrorForRetry(lastErr)
            })

    // (省略)

}

호스트 정보 업데이트


참조 소스: command/command.go#L501
command/command.go
// UpdateHostSpecs updates the host information that is already registered on Mackerel.
func (c *Context) UpdateHostSpecs() {
    // (省略)

    hostname, meta, interfaces, customIdentifier, err := collectHostSpecs()

    // (省略)

    err = c.API.UpdateHost(c.Host.ID, mackerel.HostSpec{
        Name:             hostname,
        Meta:             meta,
        Interfaces:       interfaces,
        RoleFullnames:    c.Config.Roles,
        Checks:           c.Config.CheckNames(),
        DisplayName:      c.Config.DisplayName,
        CustomIdentifier: customIdentifier,
    })

    // (省略)
}
그래서 설치를 봤어요.
Mackerel-agent 측에서 사용자 정의 ID를 생성하는 것이 기쁘다면 AWS 포인트와 같은 무에이전트 감시에 대해 나중에 에이전트를 설치할 때 같은 호스트로 판정할 수 있다.
벚꽃의 구름과 맥켈의 연합 도구인 sackerel 는 확실히 이것이 필요하다.
그게 다야.

좋은 웹페이지 즐겨찾기