presto에서 어떤항목을 수집할지 결정
- https://prestodb.io/blog/2019/08/19/memory-tracking
- https://github.com/prestodb/presto/wiki/Monitoring
- 대부분 guide에서는
FreeDistributedBytes
를 제안하긴 하지만 값이 너무 작아서(사용비율이 2%를 거의 넘지 않음. 아직 제가 잘 모르는 것일수 있습니다. 다른 분들은 수집해서 잘 써보시길 바랍니다), 최근15분 실행쿼리수를 사용해보기로 했습니다.
prometheus-adapter
- https://github.com/DirectXMan12/k8s-prometheus-adapter
- prometheus metrics를 kubernetes의 custom metrics로 보내주는 package
helm install --name prometheus-adapter-presto1 stable/prometheus-adapter -f presto-custom-metrics-values.yaml --namespace prometheus
- seriesQuery값이나 metricsQuery 연산은 prometheus server에서 실제로 수집되는지, 집계가 되는지에 대해서 확인/검증 가능합니다.
- values.yaml - 60분간의 "15분동안 실행한 쿼리" max
prometheus rules: default: false custom: - seriesQuery: '{__name__="presto_execution_querymanager_StartedQueries_FifteenMinute_Count",kubernetes_namespace="presto",kubernetes_pod_name=~"prestosql1.*"}' # seriesFilters: # - is: ^presto_clustermemory.* resources: overrides: kubernetes_pod_name: {resource: "pod"} kubernetes_namespace: {resource: "namespace"} name: matches: ^presto_execution_querymanager.* as: "presto_query_status" metricsQuery: 'max_over_time(presto_execution_querymanager_StartedQueries_FifteenMinute_Count [60m])' prometheus: url: http://prometheus-server # make sure the url is correct port: 80
custom metrics수집확인
- 어떤 항목이 수집되는지 확인
- kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
- 수집되는 gauge를 kubernetes 에서 확인하려면
- pod일 경우
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/*/presto_query_status" - namespace일 경우
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/metrics/presto_query_status"
kubectl get --raw “/apis/custom.metrics.k8s.io/v1beta1/namespaces/*/metrics/presto_query_status” - prometheus-adapter pod를 log모니터링 해보면 metrics서버에서 prometheus-adapter pod로 위와같은 요청하는걸 확인할수 있습니다
- pod일 경우
HPA적용
- HPA type종류에는 Resource, Pod, Object, External이 있는데
- Resource는 안되니까 지금과 같은 작업을 하는 것이고,
- Pod type
- prometheus-adapter log를 확인하면
/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/%2A/presto_query_status?labelSelector=app%3Dprestosql1-worker-pod
와 같이 API가 call이 되는걸 확인할 수 있는데 이는 HPA할 Deployments의 meta 입니다.
- 즉, HPA는 labelSelector는 HPA에서 지정하는 Deployments의 meta를 사용하므로 coordinator의 metrics는 가져올수가 없게되고 따라서 Pod type으로는 Pod와 scale-out 하는 deployment가 동일해야 HPA를 사용할수 있습니다.
- prometheus-adapter log를 확인하면
- External metrics는 여기서는 만들지 않아서 해당사항 없고 만드려면, 이전문서에 external-metrics-api확인
- Object
- type: Object object: metricName: presto_query_status averageValue: 1 targetValue: 11 target: apiVersion: v1 kind: Pod name: "*"
- 위와같이 하면 우리가 원하는 api로 call을 하게 되고 target에서 coordinator pod name은 임의로 생성되는 값이라 지정할수 없으니 “*” 로 설정했으며 다른 metrics를 사용하고자 한다면 namespace 상관없이 unique한 이름으로 설정해야 다른 HPA에서도 사용할수 있을듯 합니다.
- API call 형태 :
/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/%2A/presto_query_status