Trang này được dịch bởi Cloud Translation API.
Switch to English

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ổ tay

Tổng quat

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

CoreDNS là một máy chủ DNS tập trung vào việc khám phá dịch vụ và được triển khai rộng rãi như một phần của cụm Kubernetes . Vì lý do đó, nó thường được giám sát chặt chẽ bởi các hoạt động 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 mục đích demo, một máy chủ CoreDNS cục bộ với cổng 9053 mở để nhận các truy vấn DNS và cổng 9153 (defult) mở để hiển thị các số liệu để cạo. Sau đây là cấu hình Corefile cơ bản cho CoreDNS và có thể tải xuống :

.:9053 {
  prometheus
  whoami
}

Có thể tìm thấy thêm chi tiết về cài đặt trong tài liệu của CoreDNS.

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 để loại bỏ các chỉ số CoreDNS được hiển thị trên cổng 9153 từ phía trên. Tệp prometheus.yml để cấu hình cũng có sẵn để tải xuống :

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, lệnh dig có thể được sử dụng để tạo 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 Tập dữ liệu cho các số liệu CoreDNS có sẵn từ máy chủ PostgreSQL, có thể được thực hiện vớitfio.experimental.IODataset.from_prometheus . Ở mức tối thiểu cần có hai đối số. query được chuyể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 Tập dữ liệu bên dưới. Vì trước đó trong hướng dẫn, hai truy vấn DNS đã được gửi, dự kiến ​​rằng số liệu cho "coredns_dns_request_count_total" sẽ là "2.0" ở cuối 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à tập dữ liệu bao gồm một bộ (time, values) trong đó trường values là một lệnh python được mở rộng thành:

"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 phiên bản và 'coredns_dns_request_count_total' là tên chỉ số. 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.

Lấy một truy vấn khác "go_memstats_gc_sys_bytes" làm ví dụ. Vì cả CoreDNS và Prometheus đều được viết bằng Golang nên chỉ số "go_memstats_gc_sys_bytes" khả dụng cho cả công việc "coredns""prometheus" :

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

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

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

Với Dataset số liệu được tạo, có thể chuyển trực tiếp Dataset tới tf.keras để đào tạo hoặc suy luận mô hình.

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 đượ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 window window=n_stepsshift=1 được hình thành nên cần có các mẫu bổ sung (đối với bất kỳ hai phần tử window=n_steps nào, mẫu đầu tiên được lấy là x và mẫu thứ hai được lấy là y để huấn luyện). Tổng cộng là 10 + n_steps - 1 + 1 = 12 giây.

Giá trị dữ liệu cũng được chia tỷ lệ thà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.