Tải số liệu từ máy chủ Prometheus

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Đây hướng dẫn tải CoreDNS số liệu từ một Prometheus máy chủ vào một tf.data.Dataset , sau đó sử dụng tf.keras cho đào tạo và suy luận.

CoreDNS là một máy chủ DNS với trọng tâm là phát hiện dịch vụ, và được triển khai rộng rãi như là một phần của Kubernetes cluster. Vì lý do đó, nó thường được giám sát chặt chẽ bởi các hoạt động của devops.

Hướng dẫn này là một ví dụ có thể được sử dụng bởi các nhà phát triển đang tìm kiếm sự tự động hóa trong hoạt động của họ thông qua học máy.

Thiết lập và sử dụng

Cài đặt gói tensorflow-io bắt buộc và khởi động lại thời gian chạy

import os
try:
  %tensorflow_version 2.x
except Exception:
  pass
TensorFlow 2.x selected.
pip install tensorflow-io
from datetime import datetime

import tensorflow as tf
import tensorflow_io as tfio

Cài đặt và thiết lập CoreDNS và Prometheus

Đối với bản demo mục đích, một máy chủ CoreDNS tại địa phương với cổng 9053 mở để nhận các truy vấn DNS và cổng 9153 (defult) mở để lộ số liệu cho cào. Sau đây là một cấu hình cơ bản cho Corefile CoreDNS và có sẵn để tải về :

.:9053 {
  prometheus
  whoami
}

Thông tin chi tiết về việc cài đặt có thể được tìm thấy trên của CoreDNS tài liệu .

curl -s -OL https://github.com/coredns/coredns/releases/download/v1.6.7/coredns_1.6.7_linux_amd64.tgz
tar -xzf coredns_1.6.7_linux_amd64.tgz

curl -s -OL https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/prometheus/Corefile

cat Corefile
.:9053 {
  prometheus
  whoami
}
# Run `./coredns` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./coredns &')

Bước tiếp theo là để thiết lập máy chủ Prometheus và sử dụng Prometheus để CoreDNS cạo số liệu được phơi bày trên cổng 9153 từ trên cao. Các prometheus.yml tập cho cấu hình cũng có sẵn để tải về :

curl -s -OL https://github.com/prometheus/prometheus/releases/download/v2.15.2/prometheus-2.15.2.linux-amd64.tar.gz
tar -xzf prometheus-2.15.2.linux-amd64.tar.gz --strip-components=1

curl -s -OL https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/prometheus/prometheus.yml

cat prometheus.yml
global:
  scrape_interval:     1s
  evaluation_interval: 1s
alerting:
  alertmanagers:

  - static_configs:
    - targets:
rule_files:
scrape_configs:
- job_name: 'prometheus'
  static_configs:
  - targets: ['localhost:9090']
- job_name: "coredns"
  static_configs:
  - targets: ['localhost:9153']
# Run `./prometheus` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./prometheus &')

Để hiển thị một số hoạt động, dig lệnh có thể được sử dụng để tạo ra một vài truy vấn DNS đối với máy chủ CoreDNS đã được thiết lập:

sudo apt-get install -y -qq dnsutils
dig @127.0.0.1 -p 9053 demo1.example.org
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> @127.0.0.1 -p 9053 demo1.example.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53868
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 855234f1adcb7a28 (echoed)
;; QUESTION SECTION:
;demo1.example.org.     IN  A

;; ADDITIONAL SECTION:
demo1.example.org.  0   IN  A   127.0.0.1
_udp.demo1.example.org. 0   IN  SRV 0 0 45361 .

;; Query time: 0 msec
;; SERVER: 127.0.0.1#9053(127.0.0.1)
;; WHEN: Tue Mar 03 22:35:20 UTC 2020
;; MSG SIZE  rcvd: 132
dig @127.0.0.1 -p 9053 demo2.example.org
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> @127.0.0.1 -p 9053 demo2.example.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53163
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: f18b2ba23e13446d (echoed)
;; QUESTION SECTION:
;demo2.example.org.     IN  A

;; ADDITIONAL SECTION:
demo2.example.org.  0   IN  A   127.0.0.1
_udp.demo2.example.org. 0   IN  SRV 0 0 42194 .

;; Query time: 0 msec
;; SERVER: 127.0.0.1#9053(127.0.0.1)
;; WHEN: Tue Mar 03 22:35:21 UTC 2020
;; MSG SIZE  rcvd: 132

Giờ đây, một máy chủ CoreDNS có các chỉ số được máy chủ Prometheus thu thập và sẵn sàng được TensorFlow sử dụng.

Tạo Dataset cho các chỉ số CoreDNS và sử dụng nó trong TensorFlow

Tạo một Dataset cho CoreDNS số liệu có sẵn từ máy chủ PostgreSQL, có thể được thực hiện với tfio.experimental.IODataset.from_prometheus . Ở mức tối thiểu, hai đối số là cần thiết. query được truyền đến máy chủ Prometheus để chọn số liệu và length là khoảng thời gian bạn muốn tải vào Dataset.

Bạn có thể bắt đầu với "coredns_dns_request_count_total""5" (giây) để tạo ra các tập dữ liệu dưới đây. Kể từ trước đó trong hướng dẫn hai truy vấn DNS được gửi đi, đó là mong rằng các số liệu cho "coredns_dns_request_count_total" sẽ là "2.0" ở phần cuối của chuỗi thời gian:

dataset = tfio.experimental.IODataset.from_prometheus(
      "coredns_dns_request_count_total", 5, endpoint="http://localhost:9090")


print("Dataset Spec:\n{}\n".format(dataset.element_spec))

print("CoreDNS Time Series:")
for (time, value) in dataset:
  # time is milli second, convert to data time:
  time = datetime.fromtimestamp(time // 1000)
  print("{}: {}".format(time, value['coredns']['localhost:9153']['coredns_dns_request_count_total']))
Dataset Spec:
(TensorSpec(shape=(), dtype=tf.int64, name=None), {'coredns': {'localhost:9153': {'coredns_dns_request_count_total': TensorSpec(shape=(), dtype=tf.float64, name=None)} } })

CoreDNS Time Series:
2020-03-03 22:35:17: 2.0
2020-03-03 22:35:18: 2.0
2020-03-03 22:35:19: 2.0
2020-03-03 22:35:20: 2.0
2020-03-03 22:35:21: 2.0

Tìm hiểu thêm về thông số kỹ thuật của Dataset:

(
  TensorSpec(shape=(), dtype=tf.int64, name=None),
  {
    'coredns': {
      'localhost:9153': {
        'coredns_dns_request_count_total': TensorSpec(shape=(), dtype=tf.float64, name=None)
      }
    }
  }
)

Rõ ràng là các tập dữ liệu bao gồm một (time, values) tuple nơi values lĩnh vực là một dict python mở rộng sang:

"job_name": {
  "instance_name": {
    "metric_name": value,
  },
}

Trong ví dụ trên, 'coredns' là tên công việc, 'localhost:9153' là tên ví dụ, và 'coredns_dns_request_count_total' là tên metric. Lưu ý rằng tùy thuộc vào truy vấn Prometheus được sử dụng, có thể trả về nhiều công việc / trường hợp / chỉ số. Đây cũng là lý do tại sao python dict đã được sử dụng trong cấu trúc của Dataset.

Đi một truy vấn "go_memstats_gc_sys_bytes" làm ví dụ. Kể từ khi cả hai CoreDNS và Prometheus được viết bằng Golang, "go_memstats_gc_sys_bytes" số liệu có sẵn cho cả "coredns" công việc và "prometheus" công việc:

dataset = tfio.experimental.IODataset.from_prometheus(
    "go_memstats_gc_sys_bytes", 5, endpoint="http://localhost:9090")

print("Time Series CoreDNS/Prometheus Comparision:")
for (time, value) in dataset:
  # time is milli second, convert to data time:
  time = datetime.fromtimestamp(time // 1000)
  print("{}: {}/{}".format(
      time,
      value['coredns']['localhost:9153']['go_memstats_gc_sys_bytes'],
      value['prometheus']['localhost:9090']['go_memstats_gc_sys_bytes']))
Time Series CoreDNS/Prometheus Comparision:
2020-03-03 22:35:17: 2385920.0/2775040.0
2020-03-03 22:35:18: 2385920.0/2775040.0
2020-03-03 22:35:19: 2385920.0/2775040.0
2020-03-03 22:35:20: 2385920.0/2775040.0
2020-03-03 22:35:21: 2385920.0/2775040.0

Các tạo Dataset đã sẵn sàng để được chuyển tới tf.keras trực tiếp cho đào tạo hoặc suy luận hoặc mục đích bây giờ.

Sử dụng Dataset để đào tạo mô hình

Với những công cụ Dataset tạo ra, nó có thể trực tiếp vượt qua Dataset để tf.keras đào tạo mô hình hoặc suy luận.

Đối với mục đích demo, hướng dẫn này sẽ chỉ sử dụng một mô hình LSTM rất đơn giản với 1 tính năng và 2 bước làm đầu vào:

n_steps, n_features = 2, 1
simple_lstm_model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(8, input_shape=(n_steps, n_features)),
    tf.keras.layers.Dense(1)
])

simple_lstm_model.compile(optimizer='adam', loss='mae')

Tập dữ liệu sẽ được sử dụng là giá trị 'go_memstats_sys_bytes' cho CoreDNS với 10 mẫu. Tuy nhiên, vì một cửa sổ trượt của window=n_stepsshift=1 được hình thành, các mẫu cần có thêm (đối với bất kỳ hai yếu tố consecute, là người đầu tiên được thực hiện như là x và lần thứ hai được thực hiện như y cho đào tạo). Tổng là 10 + n_steps - 1 + 1 = 12 giây.

Giá trị dữ liệu cũng được thu nhỏ để [0, 1] .

n_samples = 10

dataset = tfio.experimental.IODataset.from_prometheus(
    "go_memstats_sys_bytes", n_samples + n_steps - 1 + 1, endpoint="http://localhost:9090")

# take go_memstats_gc_sys_bytes from coredns job 
dataset = dataset.map(lambda _, v: v['coredns']['localhost:9153']['go_memstats_sys_bytes'])

# find the max value and scale the value to [0, 1]
v_max = dataset.reduce(tf.constant(0.0, tf.float64), tf.math.maximum)
dataset = dataset.map(lambda v: (v / v_max))

# expand the dimension by 1 to fit n_features=1
dataset = dataset.map(lambda v: tf.expand_dims(v, -1))

# take a sliding window
dataset = dataset.window(n_steps, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda d: d.batch(n_steps))


# the first value is x and the next value is y, only take 10 samples
x = dataset.take(n_samples)
y = dataset.skip(1).take(n_samples)

dataset = tf.data.Dataset.zip((x, y))

# pass the final dataset to model.fit for training
simple_lstm_model.fit(dataset.batch(1).repeat(10),  epochs=5, steps_per_epoch=10)
Train for 10 steps
Epoch 1/5
10/10 [==============================] - 2s 150ms/step - loss: 0.8484
Epoch 2/5
10/10 [==============================] - 0s 10ms/step - loss: 0.7808
Epoch 3/5
10/10 [==============================] - 0s 10ms/step - loss: 0.7102
Epoch 4/5
10/10 [==============================] - 0s 11ms/step - loss: 0.6359
Epoch 5/5
10/10 [==============================] - 0s 11ms/step - loss: 0.5572
<tensorflow.python.keras.callbacks.History at 0x7f1758f3da90>

Trong thực tế, mô hình được đào tạo ở trên không hữu ích lắm, vì máy chủ CoreDNS đã được thiết lập trong hướng dẫn này không có bất kỳ khối lượng công việc nào. Tuy nhiên, đây là một đường dẫn đang hoạt động có thể được sử dụng để tải các chỉ số từ các máy chủ sản xuất thực sự. Mô hình sau đó có thể được cải tiến để giải quyết vấn đề trong thế giới thực về tự động hóa devops.