דף זה תורגם על ידי Cloud Translation API.
Switch to English

טען מדדים משרת פרומתאוס

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה במקור ב- GitHub הורד מחברת

סקירה כללית

מדריך זה טוען מדדי CoreDNS משרת Prometheus לתוךtf.data.Dataset , ואז משתמש ב- tf.keras לאימונים והסקות.

CoreDNS הוא שרת DNS עם דגש על גילוי שירותים, ונפרס באופן נרחב כחלק מאשכול Kubernetes . מסיבה זו לעיתים קרובות הוא עוקב מקרוב אחר פעולות devops.

מדריך זה הוא דוגמה שיכולה לשמש את הקבצים המחפשים אוטומציה בפעולותיהם באמצעות למידת מכונה.

התקנה ושימוש

התקן את חבילת 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 (defult) פתוח לחשיפת מדדים לגרידה. להלן תצורה בסיסית של 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 שהמדדים שלו נשרטים על ידי שרת פרומתאוס ומוכנים לצריכה על ידי TensorFlow.

צור מערך נתונים עבור מדדי CoreDNS והשתמש בו ב- TensorFlow

צור מערך נתונים עבור מדדי CoreDNS הזמין משרת PostgreSQL, יכול להיעשות עםtfio.experimental.IODataset.from_prometheus . במינימום יש צורך בשני ויכוחים. query מועברת לשרת פרומתאוס כדי לבחור את המדדים length הוא התקופה שברצונך לטעון במערך הנתונים.

אתה יכול להתחיל עם "coredns_dns_request_count_total" ו- "5" (שניות) כדי ליצור את מערך הנתונים למטה. מכיוון שמוקדם יותר במדריך נשלחו שתי שאילתות DNS, צפוי "coredns_dns_request_count_total" עבור "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' הוא שם המדד. שים לב, תלוי בשאילתת פרומתאוס בה נעשה שימוש, ייתכן שניתן להחזיר מספר משרות / מופעים / מדדים. זו גם הסיבה שבגללה נעשה שימוש בתכתיב פיתון במבנה מערך הנתונים.

קח "go_memstats_gc_sys_bytes" לשאילתה נוספת "go_memstats_gc_sys_bytes" . מכיוון שגם CoreDNS וגם Prometheus כתובים בגולאנג, מדד "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 ישירות ל- tf.keras למטרות הכשרה או הסקה כעת.

השתמש במערך הנתונים לאימון מודלים

עם ערכי נתונים שנוצרו ניתן להעביר ישירות את מערך tf.keras ל- tf.keras לצורך הכשרה או הסקה של מודלים.

למטרות הדגמה, הדרכה זו פשוט תשתמש במודל LSTM פשוט מאוד עם תכונה אחת ו -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 , יש צורך בדגימות נוספות (עבור כל שני אלמנטים window=n_steps , הראשון נלקח כ 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.