Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.48 KB | None | 0 0
  1. Задачи
  2.  
  3. Сбор метрик с работающего приложения
  4.  
  5.  
  6. количество резидентной и виртуальной память процесса
  7. открытые файловые дескрипторы
  8. количество процессорного времени
  9. количество потоков и goroutines
  10. время запуска процесса
  11. количество HTTP ответов по кодам
  12. гистограммы задержек HTTP ответов
  13.  
  14.  
  15. Графики
  16. Мониторинг (в работе)
  17.  
  18.  
  19. Полезные ссылки
  20.  
  21. https://prometheus.io/docs/concepts/data_model/
  22. https://prometheus.io/docs/instrumenting/exposition_formats/
  23. https://scot.coffee/2018/12/monitoring-go-applications-with-prometheus/
  24. https://habr.com/company/otus/blog/358588/
  25. https://www.digitalocean.com/community/tutorials/how-to-query-prometheus-on-ubuntu-14-04-part-1
  26.  
  27.  
  28. Сбор метрик
  29. Клиентская библиотека Prometheus для Go уже предоставляет нам почти все метрики, что нам нужны. Остается добавить только HTTP метрики.
  30. Для сбора метрик напишем простое приложение с 2 HTTP ручками для запросов и одной ручкой под экспортирование метрик для Prometheus:
  31.  
  32.  
  33. GET / - возвращает 200 OK
  34.  
  35.  
  36. GET /error - возвращает 500 Internal Server Error
  37.  
  38.  
  39. GET /metrics - возвращает 200 OK и метрики
  40.  
  41. package main
  42.  
  43. import (
  44. "fmt"
  45. "log"
  46. "net/http"
  47.  
  48. "github.com/felixge/httpsnoop"
  49. "github.com/gorilla/mux"
  50. "github.com/prometheus/client_golang/prometheus"
  51. "github.com/prometheus/client_golang/prometheus/promhttp"
  52. )
  53.  
  54. var (
  55. // Counter for calculate HTTP responses by status code and by method
  56. // app_http_requests_total{"code": "200", "method": "GET"}
  57. // https://godoc.org/github.com/prometheus/client_golang/prometheus
  58. httpReqs = prometheus.NewCounterVec(
  59. prometheus.CounterOpts{
  60. Name: "app_http_requests_total",
  61. Help: "How many HTTP requests processed, partitioned by status code and method.",
  62. },
  63. []string{"code", "method"},
  64. )
  65. // requestDuration collects sets of histograms for measure HTTP request latencies,
  66. // partitioned by method, URI and status code.
  67. requestDuration = prometheus.NewHistogramVec(
  68. prometheus.HistogramOpts{
  69. Name: "app_http_reuests_duration_seconds",
  70. Help: "Time in seconds spent serving HTTP requests.",
  71. Buckets: prometheus.DefBuckets,
  72. },
  73. []string{"method", "uri", "status_code"},
  74. )
  75. )
  76.  
  77. func init() {
  78. // Register the collectors with Prometheus's default registry.
  79. prometheus.MustRegister(httpReqs)
  80. prometheus.MustRegister(requestDuration)
  81. }
  82.  
  83. func main() {
  84. r := mux.NewRouter()
  85. r.HandleFunc("/", metricsMiddleware(indexHandler)).Methods(http.MethodGet)
  86. r.HandleFunc("/error", metricsMiddleware(errorHandler)).Methods(http.MethodGet)
  87. r.Handle("/metrics", promhttp.Handler())
  88.  
  89. log.Fatal(http.ListenAndServe(":8080", r))
  90. }
  91.  
  92. func metricsMiddleware(h http.HandlerFunc) http.HandlerFunc {
  93. return func(w http.ResponseWriter, r *http.Request) {
  94. m := httpsnoop.CaptureMetrics(h, w, r)
  95. // Increase total counter.
  96. httpReqs.WithLabelValues(strconv.Itoa(m.Code), r.Method).Inc()
  97. // Measures histograms.
  98. requestDuration.WithLabelValues(r.Method, r.URL.Path,
  99. strconv.Itoa(m.Code)).Observe(m.Duration.Seconds())
  100. }
  101. }
  102.  
  103. func indexHandler(w http.ResponseWriter, r *http.Request) {
  104. w.WriteHeader(http.StatusOK)
  105. }
  106.  
  107. func errorHandler(w http.ResponseWriter, r *http.Request) {
  108. w.WriteHeader(http.StatusInternalServerError)
  109. }
  110. После запуска приложения проверяем его работу:
  111. curl -s -i http://localhost:8080
  112. HTTP/1.1 200 OK
  113. Date: Mon, 10 Dec 2018 09:20:56 GMT
  114. Content-Length: 0
  115. curl -s -i http://localhost:8080/error
  116. HTTP/1.1 500 Internal Server Error
  117. Date: Mon, 10 Dec 2018 09:21:14 GMT
  118. Content-Length: 0
  119. и переходим к метрикам.
  120.  
  121. количество резидентной и виртуальной память процесса
  122.  
  123. curl -s -i http://localhost:8080/metrics | fgrep -e process_resident_memory_bytes -e process_virtual_memory_bytes
  124. # HELP process_resident_memory_bytes Resident memory size in bytes.
  125. # TYPE process_resident_memory_bytes gauge
  126. process_resident_memory_bytes 1.2439552e+07
  127. # HELP process_virtual_memory_bytes Virtual memory size in bytes.
  128. # TYPE process_virtual_memory_bytes gauge
  129. process_virtual_memory_bytes 5.4728704e+08
  130.  
  131. открытые файловые дескрипторы
  132.  
  133. curl -s -i http://localhost:8080/metrics | fgrep -e process_max_fds -e process_open_fds
  134. # HELP process_max_fds Maximum number of open file descriptors.
  135. # TYPE process_max_fds gauge
  136. process_max_fds 1024
  137. # HELP process_open_fds Number of open file descriptors.
  138. # TYPE process_open_fds gauge
  139. process_open_fds 8
  140.  
  141. количество процессорного времени
  142.  
  143. curl -s -i http://localhost:8080/metrics | fgrep -e process_cpu_seconds_total
  144. # HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
  145. # TYPE process_cpu_seconds_total counter
  146. process_cpu_seconds_total 0.38
  147.  
  148. количество потоков и goroutines
  149.  
  150. curl -s -i http://localhost:8080/metrics | fgrep -e go_threads -e go_goroutines
  151. # HELP go_goroutines Number of goroutines that currently exist.
  152. # TYPE go_goroutines gauge
  153. go_goroutines 7
  154. # HELP go_threads Number of OS threads created.
  155. # TYPE go_threads gauge
  156. go_threads 9
  157.  
  158. время запуска процесса
  159.  
  160. curl -s -i http://localhost:8080/metrics | fgrep -e process_start_time_seconds
  161. # HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
  162. # TYPE process_start_time_seconds gauge
  163. process_start_time_seconds 1.54443302963e+09
  164.  
  165. количество HTTP ответов по кодам
  166.  
  167. curl -s -i http://localhost:8080/metrics | fgrep -e app_http_requests_total
  168. # HELP app_http_requests_total How many HTTP requests processed, partitioned by status code.
  169. # TYPE app_http_requests_total counter
  170. app_http_requests_total{code="200",method="GET"} 643
  171. app_http_requests_total{code="500",method="GET"} 1
  172.  
  173. гистограммы задержек HTTP ответов по методу, URI и коду ответа
  174.  
  175. curl -s -i http://localhost:8080/metrics | fgrep -e app_http_reuests_duration_seconds
  176. # HELP app_http_reuests_duration_seconds Time in seconds spent serving HTTP requests.
  177. # TYPE app_http_reuests_duration_seconds histogram
  178. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.005"} 1
  179. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.01"} 1
  180. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.025"} 1
  181. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.05"} 1
  182. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.1"} 1
  183. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.25"} 1
  184. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="0.5"} 1
  185. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="1"} 1
  186. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="2.5"} 1
  187. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="5"} 1
  188. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="10"} 1
  189. app_http_reuests_duration_seconds_bucket{method="GET",status_code="200",uri="/",le="+Inf"} 1
  190. app_http_reuests_duration_seconds_sum{method="GET",status_code="200",uri="/"} 1.9163e-05
  191. app_http_reuests_duration_seconds_count{method="GET",status_code="200",uri="/"} 1
  192.  
  193. Графики
  194. Можно рисовать графики в консоли самого Prometheus, но гораздо удобнее использовать Grafana (admin:password, но лучше завести своего пользователя).
  195. Я создал Dashboard Go HTTP Testing с примерами графиков по нашим метрикам.
  196. Для наглядности используем hey для подачи нагрузки
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement