그라파나 구름층의 Statsd+프로메테우스

2021년 1월 12일Grafana Labs announced Grafana Cloud의 업데이트 버전.나에게 있어서 가장 중요한 것은 새로운 계획이 실제로는 무료라는 것이다.단지 확인하고 싶을 뿐입니다. 이것은 유료 판촉 광고가 아닙니다. 저는 정말 흥분했습니다.
나는 공고를 보자마자 애완동물 프로젝트에서 나의 도량을 갱신하여 사용하기 시작했다.내 프로젝트에서 나는 거의 Statsd를 도량 기준으로 사용하지만 일상적인 업무에서 나도 프로메테우스를 사용한다.

Grafana 클라우드 계정 제한 없음
Grafana Cloud를 무료로 사용할 것을 고려하고 있다면, 당신은 알고 있을 것입니다. limitations of free accounts
  • 10000 시리즈 프로메테우스 또는 흑연 도량기
  • 50GB 로그
  • 지표 및 로그의 14일 보존 기간
  • 팀원 최대 3명 사용 가능

  • 보안 및 개인 정보 보호 문제
    네 머릿속에 스쳐 지나갈 수 있는 첫 번째 일은 너의 지표를 구름 속에 넣는 것이 안전한지 의심하는 것이다.응, 생각이 좀 있어.
  • 신뢰는 분명히 첫 번째는 지표를 보내는 장소에 대해 어느 정도 신뢰를 가져야 한다는 것이다.나에게 있어서 이것은 완전히 나와 개원Grafana의 상호작용과 그들의 Github 문제에 기초한 것이다.
  • PII 개인 정보를 보내지 않도록 하겠습니다.만약 나의 지표가premise나 나의 집단에 저장된다면 나는 틀림없이 이렇게 하지 않을 것이다.
  • 인증 메트릭 전송을 위해서는 인증 및 암호화가 모두 있어야 합니다
  • .
    우리 는 내 발견 을 보고, 이것 이 내 걱정 을 완화시킬 수 있는지 없는지 봅시다

    스타즈인가 프로메테우스인가
    주의해야 할 점은Grafana Cloud Statsd 서버가 메트릭을 보낼 수 없다는 것입니다.있더라도 인증과 암호화를 위해 Statsd를 사용하는 것은 지원되지 않습니다.이것은 내부에 해결 방안을 배치하거나 당신이 가지고 있는 그룹에서 가능하지만 클라우드에 도량을 보낼 때 더 좋은 선택이 있어야 합니다.
    이상적인 해결 방안은 Statsd 지표를 보내서Prometheus로 전환한 다음에Prometheus에 내장된remote_write 기능을 사용할 수 있다는 것이다.이것은 내가 발견했을 때Statsd Prometheus Exporter다.

    프로메테우스에게 경의를 표하다
    내보내기는 Statsd 서버로 /metrics 단점의 지표를 내보내는 데 사용됩니다.이렇게 하면 내가 해야 할 일은 도출기를 Kubernetes에 배치한 다음에 도량을 보낼 호스트를 바꾸는 것이다., , !
    현재, 이것은 Statsd에서 프로메테우스로 전환하는 간단한 방법이지만, 가장 좋은 두 가지 공제 유형을 얻지 못했다.프로메테우스의 아름다움은 미터법과 라벨이 있지만 Statsd에는 라벨이 없다는 데 있다.Statsd 도량에 상하문을 더 추가하려면 키 이름에 추가해야 합니다. 이것은 프로메테우스의 방법이 아닙니다.
    다행히도 Statsd Prometheus Exporter 이미4 awesome tagging/labelling extensionsStatsd 도량 프로토콜에 연결되었고, 이 프로토콜은 나도 도량을 보낼 수 있도록 허락했다.

    혼합 메트릭 클라이언트
    내 자신의 도량을 더욱 쉽게 실현하기 위해, 나는 Golang에 간단한 도량 인터페이스를 만들고, 그 다음에 '혼합' 도량 유형을 실현했다.

    메트릭 인터페이스
    package metrics
    
    //ClientInterface ...
    type ClientInterface interface {
        Init() error
        Increment(key string, labels map[string]string)
        IncrementBy(key string, by int, labels map[string]string)
        Gauge(key string, value int, labels map[string]string)
    }
    

    혼합 실현
    블렌드 유형은 바로 제가 말하는 Statsd+ 태그 솔루션입니다.인터페이스에서 볼 수 있듯이 나는 두 가지 도량 유형, 즉 증량과 규격만 실현했다.모든 탭에는 키, 값, 문자열에 대한 탭이 있습니다.이것은 statsd 혼합 구현입니다.
    package metrics
    
    import (
        "fmt"
        "strings"
        "time"
    
        "github.com/alexcesaro/statsd"
    )
    
    // Hybrid metrics
    type Hybrid struct {
        Statsd       StatsdConfig
        Client       *statsd.Client
        AttachLabels bool
    }
    
    // StatsdConfig ...
    type StatsdConfig struct {
        Host   string
        Prefix string
    }
    
    // Init ...
    func (m *Hybrid) Init() error {
        // Set up the statsd client
        client, err := statsd.New(
            statsd.Address(m.Statsd.Host),
            statsd.Prefix(m.Statsd.Prefix),
            statsd.FlushPeriod(time.Second*1),
        )
        if err != nil {
            return fmt.Errorf("Hybrid: Could not connect to %s: %s", m.Statsd.Host, err.Error())
        }
        m.Client = client
        return nil
    }
    
    // Format key with labels
    func (m *Hybrid) formatKeyWithLabels(key string, labels map[string]string) string {
        // Do we want to attach labels?
        if m.AttachLabels == false {
            return key
        }
    
        // Use librato-style tags
        // metrim.name#tagName=val,tag2Name=val2:0|c
        // https://github.com/prometheus/statsd_exporter#tagging-extensions
        if len(key) == 0 {
            return key
        }
        formattedLabels := []string{}
        for labelKey, labelVal := range labels {
            formattedLabels = append(formattedLabels, fmt.Sprintf("%s=%s", labelKey, labelVal))
        }
        joinedFormattedLabels := strings.TrimSpace(strings.Join(formattedLabels, ","))
        if joinedFormattedLabels != "" {
            key = fmt.Sprintf("%s#%s", key, joinedFormattedLabels)
        }
    
        return strings.Trim(key, "#")
    }
    
    // Increment ...
    func (m *Hybrid) Increment(key string, labels map[string]string) {
        m.IncrementBy(key, 1, labels)
    }
    
    // IncrementBy ...
    func (m *Hybrid) IncrementBy(key string, by int, labels map[string]string) {
        updatedKey := m.formatKeyWithLabels(key, labels)
        if m.Client != nil {
            m.Client.Count(updatedKey, by)
        }
    }
    
    // Gauge ...
    func (m *Hybrid) Gauge(key string, value int, labels map[string]string) {
        updatedKey := m.formatKeyWithLabels(key, labels)
        if m.Client != nil {
            m.Client.Gauge(updatedKey, value)
        }
    }
    

    Grafana Cloud로 보내기
    현재 저는 도량을 Prometheus로 내보낼 수 있습니다. Kubernetes 그룹에 실행 중인 기존 Prometheus 서버를 사용하여Grafana Cloud에 쉽게 보낼 수 있습니다.
    내가 해야 할 일은 바로 나의 프로메테우스 스크레이퍼 설정에 다음과 같은 내용을 추가하는 것이다.
    remote_write:
    - url: https://prometheus-us-central1.grafana.net/api/prom/push
      basic_auth:
        username: '<my-user-id-here>'
        password: '<my-auth-token-here>'
    
    

    결론
    내가 가장 걱정하는 것은 내가 이 문장 맨 위에 열거한 세 가지 문제다.
    믿음: 나는 그들을 믿습니까?지금까지 나는 그들을 믿지 않을 이유가 없다.이것은 결함일 수도 있지만, 나는 너무 쉽게 믿을 수 있다.
  • PII 나는 나의 모든 코드를 검사했고 나의 지표에서 PII를 삭제했으며 내가 필요로 하는 곳에서 ID를 사용했다. 이것은 단지 몇 번일 뿐이다.
  • 인증은 프로메테우스를 저장 및 송신/수신 지표로 선택하는 방식으로 내장remove_write 기능은 인증(기본 인증)과 암호화(SSL)를 포함한다.
  • 나의 최초의 세 가지 걱정이 모두 완화되었다. 나는Grafana 클라우드 솔루션과 인프라 시설의 절약에 대해 매우 만족한다. 왜냐하면Grafana,statsd,graphite와 다른 관련 서비스를 직접 위탁할 필요가 없기 때문이다.
    저는 회원 링크가 없지만 반드시 sign up for an account무료(단 제한)의metrics 인프라를 받아야 합니다!

    좋은 웹페이지 즐겨찾기