بارگیری معیارها از سرور Prometheus

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

این آموزش بارهای CoreDNS معیارهای از پرومته سرور به یک tf.data.Dataset ، سپس با استفاده از tf.keras برای آموزش و استنتاج است.

CoreDNS یک سرور DNS با تمرکز بر کشف سرویس است، و به طور گسترده ای به عنوان بخشی از مستقر Kubernetes خوشه. به همین دلیل اغلب توسط عملیات توسعه دهنده نظارت دقیق می شود.

این آموزش نمونه ای است که می تواند توسط توسعه دهندگانی که به دنبال اتوماسیون در عملیات خود از طریق یادگیری ماشین هستند، استفاده شود.

راه اندازی و استفاده

بسته tensorflow-io مورد نیاز را نصب کنید و زمان اجرا را مجددا راه اندازی کنید

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

CoreDNS و Prometheus را نصب و راه اندازی کنید

برای نسخه ی نمایشی اهداف، یک سرور با پورت CoreDNS به صورت محلی 9053 باز به دریافت نمایش داده شد DNS و پورت 9153 (مجموعه اشعار) باز به افشای معیارهای برای خراش دادن. در زیر به تنظیمات اولیه Corefile برای CoreDNS است و در دسترس است دانلود :

.:9053 {
  prometheus
  whoami
}

جزئیات بیشتر در مورد نصب و راه اندازی می تواند در 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 &')

گام بعدی این است برای راه اندازی سرور پرومته و استفاده از پرومته به CoreDNS ضایعات معیارهای که در پورت در معرض 9153 از بالا. prometheus.yml فایل برای پیکربندی نیز موجود است برای دانلود :

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 &')

به منظور نشان دادن برخی از فعالیت های، dig فرمان می تواند مورد استفاده برای تولید چند نمایش داده شد DNS در برابر سرور CoreDNS است که راه اندازی شده است:

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

اکنون یک سرور CoreDNS که معیارهای آن توسط یک سرور Prometheus خراشیده شده و آماده مصرف توسط TensorFlow است.

مجموعه داده را برای معیارهای CoreDNS ایجاد کنید و از آن در TensorFlow استفاده کنید

یک DataSet برای CoreDNS معیارهای موجود از سرور PostgreSQL است که می تواند با انجام tfio.experimental.IODataset.from_prometheus . در حد اقل دو آرگومان مورد نیاز است. query به سرور پرومته گذشت برای انتخاب معیارهای و length دوره شما می خواهید را به بار به مجموعه داده است.

شما می توانید با شروع "coredns_dns_request_count_total" و "5" (ثانیه) برای ایجاد مجموعه داده است. از آنجا که پیش از آن در آموزش دو نمایش داده شد DNS فرستاده شدند، انتظار می رود که متریک برای "coredns_dns_request_count_total" خواهد بود "2.0" در پایان سری زمانی:

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

نگاهی بیشتر به مشخصات مجموعه داده:

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

واضح است که مجموعه داده شامل یک (time, values) تاپل که در آن values زمینه بینی پایتون گسترش به است:

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

در مثال بالا، 'coredns' نام شغل است، در 'localhost:9153' به عنوان مثال نام است، و 'coredns_dns_request_count_total' نام متریک است. توجه داشته باشید که بسته به پرس و جوی Prometheus استفاده شده، ممکن است چندین شغل/نمونه/متریک بازگردانده شوند. به همین دلیل است که پایتون dict در ساختار Dataset استفاده شده است.

نگاهی دیگر جستجوهای "go_memstats_gc_sys_bytes" به عنوان مثال. از آنجا که هر دو CoreDNS و پرومته در Golang نوشته شده است، "go_memstats_gc_sys_bytes" متریک دسترس برای هر دو است "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 آماده است تا به تصویب رسید است tf.keras به طور مستقیم برای آموزش و یا استنتاج اهداف است.

از Dataset برای آموزش مدل استفاده کنید

با معیارهای مجموعه داده ایجاد، ممکن است به طور مستقیم تصویب DataSet به tf.keras برای آموزش مدل و یا استنتاج است.

برای اهداف نمایشی، این آموزش فقط از یک مدل بسیار ساده LSTM با 1 ویژگی و 2 مرحله به عنوان ورودی استفاده می کند:

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')

مجموعه داده مورد استفاده مقدار 'go_memstats_sys_bytes' برای CoreDNS با 10 نمونه است. اما، از آنجا یک پنجره کشویی از window=n_steps و shift=1 تشکیل شده است، نمونه های اضافی مورد نیاز است (برای هر دو عنصر consecute، اولین عنوان گرفته x و دوم به عنوان گرفته y برای آموزش). کل است 10 + n_steps - 1 + 1 = 12 ثانیه صورت گرفت.

ارزش داده ها نیز به کوچک [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>

مدل آموزش‌دیده‌شده بالا در واقعیت چندان کاربردی نیست، زیرا سرور CoreDNS که در این آموزش راه‌اندازی شده است، حجم کاری ندارد. با این حال، این خط لوله کاری است که می تواند برای بارگیری معیارها از سرورهای تولید واقعی استفاده شود. سپس این مدل می تواند برای حل مشکل واقعی اتوماسیون devops بهبود یابد.