หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

โหลดเมทริกจากเซิร์ฟเวอร์ Prometheus

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

ภาพรวม

บทช่วยสอนนี้โหลดเมทริก CoreDNS จากเซิร์ฟเวอร์ Prometheus ไปยัง 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
Requirement already satisfied: tensorflow-io in /usr/local/lib/python3.6/dist-packages (0.12.0)
Requirement already satisfied: tensorflow<2.2.0,>=2.1.0 in /tensorflow-2.1.0/python3.6 (from tensorflow-io) (2.1.0)
Requirement already satisfied: opt-einsum>=2.3.2 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (3.2.0)
Requirement already satisfied: google-pasta>=0.1.6 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.1.8)
Requirement already satisfied: tensorflow-estimator<2.2.0,>=2.1.0rc0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2.1.0)
Requirement already satisfied: tensorboard<2.2.0,>=2.1.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2.1.0)
Requirement already satisfied: wheel>=0.26; python_version >= "3" in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.34.2)
Requirement already satisfied: grpcio>=1.8.6 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.27.2)
Requirement already satisfied: astor>=0.6.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.8.1)
Requirement already satisfied: absl-py>=0.7.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.9.0)
Requirement already satisfied: termcolor>=1.1.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.1.0)
Requirement already satisfied: numpy<2.0,>=1.16.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.18.1)
Requirement already satisfied: keras-applications>=1.0.8 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.0.8)
Requirement already satisfied: protobuf>=3.8.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (3.11.3)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.1.0)
Requirement already satisfied: wrapt>=1.11.1 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.12.0)
Requirement already satisfied: gast==0.2.2 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.2.2)
Requirement already satisfied: scipy==1.4.1; python_version >= "3" in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.4.1)
Requirement already satisfied: six>=1.12.0 in /tensorflow-2.1.0/python3.6 (from tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.14.0)
Requirement already satisfied: markdown>=2.6.8 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (3.2.1)
Requirement already satisfied: setuptools>=41.0.0 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (45.2.0)
Requirement already satisfied: werkzeug>=0.11.15 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.0.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.4.1)
Requirement already satisfied: google-auth<2,>=1.6.3 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.11.2)
Requirement already satisfied: requests<3,>=2.21.0 in /tensorflow-2.1.0/python3.6 (from tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2.23.0)
Requirement already satisfied: h5py in /tensorflow-2.1.0/python3.6 (from keras-applications>=1.0.8->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2.10.0)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /tensorflow-2.1.0/python3.6 (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.3.0)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /tensorflow-2.1.0/python3.6 (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.2.8)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /tensorflow-2.1.0/python3.6 (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (4.0.0)
Requirement already satisfied: rsa<4.1,>=3.1.4 in /tensorflow-2.1.0/python3.6 (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (4.0)
Requirement already satisfied: certifi>=2017.4.17 in /tensorflow-2.1.0/python3.6 (from requests<3,>=2.21.0->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2019.11.28)
Requirement already satisfied: idna<3,>=2.5 in /tensorflow-2.1.0/python3.6 (from requests<3,>=2.21.0->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (2.9)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /tensorflow-2.1.0/python3.6 (from requests<3,>=2.21.0->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (1.25.8)
Requirement already satisfied: chardet<4,>=3.0.2 in /tensorflow-2.1.0/python3.6 (from requests<3,>=2.21.0->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (3.0.4)
Requirement already satisfied: oauthlib>=3.0.0 in /tensorflow-2.1.0/python3.6 (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (3.1.0)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /tensorflow-2.1.0/python3.6 (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow<2.2.0,>=2.1.0->tensorflow-io) (0.4.8)

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

ขั้นตอนต่อไปคือการตั้งค่าเซิร์ฟเวอร์ Prometheus และใช้ Prometheus เพื่อขูดขีดตัวประมวลผล 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

สร้างชุดข้อมูลสำหรับการวัด CoreDNS ที่พร้อมใช้งานจากเซิร์ฟเวอร์ PostgreSQL สามารถทำได้ด้วย tfio.experimental.IODataset.from_prometheus ที่ minimium จำเป็นต้องมีสองข้อโต้แย้ง query จะถูกส่งไปยังเซิร์ฟเวอร์ Prometheus เพื่อเลือกตัวชี้วัดและ 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)
      }
    }
  }
)

 

เป็นที่ชัดเจนว่าชุดข้อมูลประกอบด้วย tuple (time, values) โดยที่ฟิลด์ values เป็น pict dython ที่ขยายเข้าไปใน:

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

ในตัวอย่างข้างต้น 'coredns' เป็นชื่องาน 'localhost:9153' เป็นชื่ออินสแตนซ์และ 'coredns_dns_request_count_total' เป็นชื่อ 'coredns_dns_request_count_total' โปรดทราบว่าขึ้นอยู่กับแบบสอบถาม Prometheus ที่ใช้เป็นไปได้ว่าหลายงาน / อินสแตนซ์ / ตัวชี้วัดอาจถูกส่งกลับ นี่คือเหตุผลที่ pict dython ถูกใช้ในโครงสร้างของชุดข้อมูล

ใช้แบบสอบถามอื่น "go_memstats_gc_sys_bytes" เป็นตัวอย่าง เนื่องจากทั้ง CoreDNS และ Prometheus เขียนใน 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 โดยตรงสำหรับการฝึกอบรมหรือการอนุมานตอนนี้

ใช้ชุดข้อมูลสำหรับฝึกอบรมโมเดล

ด้วยชุดข้อมูล tf.keras สร้างขึ้นจึงเป็นไปได้ที่จะส่งชุดข้อมูลไปยัง 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 ถูกสร้างขึ้นจึงจำเป็นต้องมีการสุ่มตัวอย่างเพิ่มเติม (สำหรับองค์ประกอบสองอย่างใดอย่างหนึ่ง) สิ่งแรกจะถูกนำมาเป็น 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