pushgateway 로 application log 수집에 관한 이야기

마가·2022년 8월 17일
0

trial-error

목록 보기
7/19

prometheus로 application metric을 수집하기 위해서는 application에 metric 서버를 생성하고, prometheus에서 해당 metric 서버를 가져오도록 설정해야 한다. << 이거 곧 해야 하는 일
그런데 batch 처럼 잠깐 켜졌다 꺼지는 경우에는 그렇게 할 경우 적절한 metric을 가져올 수 있다는 보장이 없으므로 push gateway에다가 데이터를 저장한다.
그래서 꺼지고 안 꺼지고를 수집하는 것을 먼저 진행했는데....

  VPKafka.prometheusClient.status(
    EnumPrometheusStatus.INACTIVE,
    new StatusLabel(`${topic}`, `${process.env.CONSUMER_GROUP}`)
  )
  console.info(`${topic} runner finished`)
  process.exit(0)
}
... VPKafka.prometheusClient부분
  public async status(status:number, labels:StatusLabel) {
    await this.push(labels.toParams(), `crawler_status ${status}`)
  }
  
  private async push(param:string, body:string):Promise<void> {
    try {
      console.info(`prometheus push : ${param} & ${body}`)
      const res = await axios.post(
        `${this.pushgatewayUrl}/${param}`,
        `${body}\n`,
        { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
      )
    } catch (e) {
      console.error('PrometheusClient push error')
      console.error(e)
    }
  }

이러면 status가 INACTIVE로 안 바뀌고 ACTIVE 상태로 유지된다.
process.exit이 너무 빨라서 그런 것...
status를 요청하는 부분에 await를 줘서 INACTIVE 호출을 적절히 기다려 줘야 한다.

이후 크롤러 코드 곧곧에 error를 activate 하는 코드를 짜두고, 배치를 시작할 때 이전 작업의 error를 모두 지우는 코드

      const res = await axios.get(`${process.env.PROMETHEUS_URL}/api/v1/query?query=crawler_error`
     + `{job="${process.env.JOB_TAG ?? 'default'}",topic="${topic}",consumer="${consumer}"}`)

      const data = res.data as any
      // data will be
      // {"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"crawler_error",
      // "consumer":"consumer","job":"default","topic":"topic"},"value":[1660741941.253,"0"]}]}}
      const querys:string[] = data.data.result.map((elm:any) => {
        // query will be
        // /consumer/$consumer/job/$job/topic/$topic/...
        const query = Object.keys(elm.metric)
          .filter((key:string) => key.indexOf('__name__') === -1)
          .reduce((acc:string, key:string) => `${acc}${key}/${elm.metric[key]}/`, '/')
          .slice(0, -1)
        return query
      })
      querys.forEach((query:string) => {
        axios.delete(`${process.env.PUSHGATEWAY_URL}${query}`)
        console.log(`delete ${process.env.PUSHGATEWAY_URL}${query}`)
      })

젠장. 에러를 지우는 것이 너무 어려웠다.
이후 그라파나에서 error가 1이 되면 죽는 걸로 하자.

내용추가
위 코드에서 /job/$job 이 제일 앞에 와야 한다.
안그러면 404뜸.

profile
마음 가는 길은 죽 곧은 길

0개의 댓글