Prometheus sunucusundan metrikleri yükleyin

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

Bir gelen bu öğretici yükler CoreDNS ölçümlerini Prometheus bir içine sunucuya tf.data.Dataset ardından kullandığı tf.keras eğitim ve çıkarım için.

CoreDNS servis keşif odaklanarak bir DNS sunucusu olduğu ve yaygın bir parçası olarak dağıtıldığı Kubernetes küme. Bu nedenle genellikle devops işlemleri tarafından yakından izlenir.

Bu öğretici, makine öğrenimi yoluyla operasyonlarında otomasyon arayan geliştiriciler tarafından kullanılabilecek bir örnektir.

Kurulum ve kullanım

Gerekli tensorflow-io paketini kurun ve çalışma zamanını yeniden başlatın

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 ve Prometheus'u kurun ve kurun

Demo amaçlar için, bağlantı noktası ile yerel olarak bir CoreDNS sunucusu 9053 açık DNS sorguları ve port almak 9153 kazıma ilişkin ölçümleri ortaya çıkarmak için açık (defult). Aşağıdaki CoreDNS için temel Corefile yapılandırma ve kullanılabilir yükleme :

.:9053 {
  prometheus
  whoami
}

Yükleme hakkında daha fazla ayrıntı CoreDNS en öğrenilmesi mümkündür belgeler .

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

Bir sonraki adım kurulum Prometheus sunucuya ve bağlantı noktasında maruz sıyrık CoreDNS ölçümlere Prometheus'u kullanmak 9153 yukarıdan. prometheus.yml yapılandırma için dosya için de kullanılabilir indirmek :

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

Bazı aktiviteyi göstermek amacıyla, dig komut kurulum olmuştur CoreDNS sunucuya karşı birkaç DNS sorguları oluşturmak için kullanılabilir:

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

Artık, ölçümleri bir Prometheus sunucusu tarafından kazınmış ve TensorFlow tarafından tüketilmeye hazır bir CoreDNS sunucusu.

CoreDNS ölçümleri için Veri Kümesi oluşturun ve bunu TensorFlow'da kullanın

PostgreSQL sunucusu edinilebilir CoreDNS metrikler için bir Veri Kümesi oluşturun ile yapılabilirdi tfio.experimental.IODataset.from_prometheus . Asgari düzeyde iki argümana ihtiyaç vardır. query ölçümlerini seçmek için Prometheus sunucuya geçirilir ve length DataSetbırakma içine yüke istediğiniz dönemdir.

Sen başlayabilir "coredns_dns_request_count_total" ve "5" altında Veri Kümesi oluşturmak için (sn). Öğretici iki DNS sorguları önceki gönderildi yana, için ölçümlerini beklenmektedir "coredns_dns_request_count_total" olacak "2.0" Zaman dizilerinin sonunda:

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

Veri Kümesinin özelliklerine daha fazla bakmak:

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

Veri kümesi bir oluştuğunu açıktır (time, values) tuple values alan içine genişletilmiş bir piton dict geçerli:

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

Yukarıdaki örnekte, 'coredns' , iş adıdır 'localhost:9153' örnek adıdır ve 'coredns_dns_request_count_total' metrik adıdır. Kullanılan Prometheus sorgusuna bağlı olarak, birden fazla işin/örnek/ölçümün döndürülebileceğini unutmayın. Bu aynı zamanda Veri Kümesinin yapısında python dict kullanılmasının nedenidir.

Başka bir sorgu al "go_memstats_gc_sys_bytes" örnek olarak. Her iki CoreDNS ve Prometheus Golang yazılmış olduğundan, "go_memstats_gc_sys_bytes" metrik ikisi için kullanılabilir "coredns" iş ve "prometheus" iş:

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

Oluşturulan Dataset geçirilecek hazır tf.keras şimdi ya eğitim ya da çıkarsama amaçlı doğrudan.

Model eğitimi için Veri Kümesini kullanın

Veri kümesi oluşturulan ölçümler ile, doğrudan Dataset geçmek mümkündür tf.keras modeli eğitim veya çıkarım için.

Demo amacıyla, bu eğitimde giriş olarak 1 özellik ve 2 adımlı çok basit bir LSTM modeli kullanılacaktır:

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

Kullanılacak veri seti, 10 örnekle CoreDNS için 'go_memstats_sys_bytes' değeridir. Bununla birlikte, bir kayan pencere çünkü window=n_steps ve shift=1 oluşturulur, ilave örnekler (iki consecute elemanları için, ilk olarak alınır ihtiyaç vardır x ve ikinci olarak alınır y eğitim için). Toplam olan 10 + n_steps - 1 + 1 = 12 saniye.

Veri değeri de ölçeklendirilir [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>

Bu eğitimde kurulan CoreDNS sunucusunun herhangi bir iş yükü olmadığından, yukarıdaki eğitilmiş model gerçekte pek kullanışlı değildir. Ancak bu, gerçek üretim sunucularından ölçümleri yüklemek için kullanılabilecek çalışan bir işlem hattıdır. Model daha sonra gerçek dünyadaki devops otomasyonu sorununu çözmek için geliştirilebilir.