릴리스 노트
제품 릴리스 기록
httpserver_requests_total 메트릭을 열고 HTTP 요청을 기록하는 Golang 서비스 애플리케이션을 예로 듭니다. 이 메트릭은 아래와 같이 서비스 애플리케이션의 QPS 값을 계산하는 데 사용할 수 있습니다.package mainimport ("github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp""net/http""strconv")var (HTTPRequests = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "httpserver_requests_total",Help: "Number of the http requests received since the server started",},[]string{"status"},))func init() {prometheus.MustRegister(HTTPRequests)}func main(){http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {path := r.URL.Pathcode := 200switch path {case "/test":w.WriteHeader(200)w.Write([]byte("OK"))case "/metrics":promhttp.Handler().ServeHTTP(w, r)default:w.WriteHeader(404)w.Write([]byte("Not Found"))}HTTPRequests.WithLabelValues(strconv.Itoa(code)).Inc()})http.ListenAndServe(":80", nil)}
apiVersion: apps/v1kind: Deploymentmetadata:name: httpservernamespace: httpserverspec:replicas: 1selector:matchLabels:app: httpservertemplate:metadata:labels:app: httpserverspec:containers:- name: httpserverimage: registry.imroc.cc/test/httpserver:custom-metricsimagePullPolicy: Always---apiVersion: v1kind: Servicemetadata:name: httpservernamespace: httpserverlabels:app: httpserverannotations:prometheus.io/scrape: "true"prometheus.io/path: "/metrics"prometheus.io/port: "http"spec:type: ClusterIPports:- port: 80protocol: TCPname: httpselector:app: httpserver
- job_name: httpserverscrape_interval: 5skubernetes_sd_configs:- role: endpointsnamespaces:names:- httpserverrelabel_configs:- action: keepsource_labels:- __meta_kubernetes_service_label_appregex: httpserver- action: keepsource_labels:- __meta_kubernetes_endpoint_port_nameregex: http
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:name: httpserverspec:endpoints:- port: httpinterval: 5snamespaceSelector:matchNames:- httpserverselector:matchLabels:app: httpserver
httpserver_requests_total 메트릭을 사용하므로 아래와 같이 다음 PromQL을 통해 각 서비스 Pod의 QPS를 계산할 수 있습니다.sum(rate(http_requests_total[2m])) by (pod)
values.yaml을 생성합니다.rules:default: falsecustom:- seriesQuery: 'httpserver_requests_total'resources:template: <<.Resource>>name:matches: "httpserver_requests_total"as: "httpserver_requests_qps" # PromQL에서 계산한 QPS 메트릭metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)prometheus:url: http://prometheus.monitoring.svc.cluster.local # Prometheus API 주소 교체(포트 필요 없음)port: 9090
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm repo update# Helm 3helm install prometheus-adapter prometheus-community/prometheus-adapter -f values.yaml# Helm 2# helm install --name prometheus-adapter prometheus-community/prometheus-adapter -f values.yaml
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1{"kind": "APIResourceList","apiVersion": "v1","groupVersion": "custom.metrics.k8s.io/v1beta1","resources": [{"name": "jobs.batch/httpserver_requests_qps","singularName": "","namespaced": true,"kind": "MetricValueList","verbs": ["get"]},{"name": "pods/httpserver_requests_qps","singularName": "","namespaced": true,"kind": "MetricValueList","verbs": ["get"]},{"name": "namespaces/httpserver_requests_qps","singularName": "","namespaced": false,"kind": "MetricValueList","verbs": ["get"]}]}
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/httpserver/pods/*/httpserver_requests_qps{"kind": "MetricValueList","apiVersion": "custom.metrics.k8s.io/v1beta1","metadata": {"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/httpserver/pods/%2A/httpserver_requests_qps"},"items": [{"describedObject": {"kind": "Pod","namespace": "httpserver","name": "httpserver-6f94475d45-7rln9","apiVersion": "/v1"},"metricName": "httpserver_requests_qps","timestamp": "2020-11-17T09:14:36Z","value": "500m","selector": null}]}
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:name: httpservernamespace: httpserverspec:minReplicas: 1maxReplicas: 1000scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: httpservermetrics:- type: Podspods:metric:name: httpserver_requests_qpstarget:averageValue: 50type: AverageValue
$ kubectl get hpaNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEhttpserver Deployment/httpserver 83933m/50 1 1000 2 18h$ kubectl get podsNAME READY STATUS RESTARTS AGEhttpserver-6f94475d45-47d5w 1/1 Running 0 3m41shttpserver-6f94475d45-7rln9 1/1 Running 0 37hhttpserver-6f94475d45-6c5xm 0/1 ContainerCreating 0 1shttpserver-6f94475d45-wl78d 0/1 ContainerCreating 0 1s
피드백