इस पेज का अनुवाद Cloud Translation API से किया गया है.
Switch to English

प्रोमेथियस सर्वर से लोड मेट्रिक्स

TensorFlow.org पर देखें Google Colab में चलाएं GitHub पर स्रोत देखें नोटबुक डाउनलोड करें

अवलोकन

एक से इस ट्यूटोरियल भार CoreDNS मैट्रिक्स प्रोमेथियस एक में सर्वर tf.data.Dataset , तो का उपयोग करता tf.keras प्रशिक्षण और अनुमान के लिए।

CoreDNS एक डीएनएस सर्वर है जो सेवा खोज पर ध्यान केंद्रित करता है, और व्यापक रूप से कुबेरनेट्स क्लस्टर के एक भाग के रूप में तैनात किया गया है। उस कारण से यह अक्सर डेपॉप्स ऑपरेशंस द्वारा बारीकी से निगरानी कर रहा है।

यह ट्यूटोरियल एक उदाहरण है जिसका उपयोग मशीन सीखने के माध्यम से अपने संचालन में स्वचालन की तलाश करने वाले देवों द्वारा किया जा सकता है।

सेटअप और उपयोग

आवश्यक टेंसरफ़्लो-आईओ पैकेज स्थापित करें, और रनटाइम को पुनरारंभ करें

 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 और प्रोमेथियस सेटअप करें

डेमो उद्देश्यों के लिए, पोर्ट 9053 साथ स्थानीय रूप से एक CoreDNS सर्वर DNS प्रश्नों को प्राप्त करने के लिए खुला है और स्क्रैपिंग के लिए मैट्रिक्स का पर्दाफाश करने के लिए 9153 (डिफॉल्ट) पोर्ट खोलता है। निम्नलिखित CoreDNS के लिए एक मूल Corefile कॉन्फ़िगरेशन है और डाउनलोड करने के लिए उपलब्ध है:

 .:9053 {
  prometheus
  whoami
}
 

स्थापना के बारे में अधिक विवरण कोरडएनएस के प्रलेखन पर पाया जा सकता है।

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

अगला कदम प्रोमेथियस सर्वर को सेटअप करना है और कोरडेएनएस मेट्रिक्स को फैलाने के लिए प्रोमेथियस का उपयोग करना है जो ऊपर से पोर्ट 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 आदेश CoreDNS सर्वर है कि सेटअप किया गया है के खिलाफ कुछ DNS क्वेरी उत्पन्न करने के लिए इस्तेमाल किया जा सकता:

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 मेट्रिक्स के लिए एक डेटासेट बनाएं जो पोस्टग्रेसीक्यूएल सर्वर से उपलब्ध है, tfio.experimental.IODataset.from_prometheus साथ किया जा सकता है। कम से कम दो तर्कों की जरूरत है। मैट्रिक्स और length का चयन करने के लिए query को प्रोमेथियस सर्वर से पास किया जाता है और यह वह अवधि है जिसे आप डेटासेट में लोड करना चाहते हैं।

आप नीचे दिए गए डेटासेट बनाने के लिए "coredns_dns_request_count_total" और "5" (secs) से शुरू कर सकते हैं। चूँकि पहले ट्यूटोरियल में दो 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' मीट्रिक नाम है। ध्यान दें कि इस्तेमाल किए गए प्रोमेथियस क्वेरी के आधार पर, यह संभव है कि कई नौकरियां / इंस्टेंसेस / मीट्रिक वापस आ सकें। यही कारण है कि डेटासट की संरचना में अजगर का इस्तेमाल किया गया है।

एक अन्य क्वेरी "go_memstats_gc_sys_bytes" को एक उदाहरण के रूप में लें। चूंकि दोनों CoreDNS और प्रोमेथियस को गोलंग में लिखा गया है, "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 पास करना संभव है।

डेमो उद्देश्यों के लिए, यह ट्यूटोरियल केवल 1 फीचर और इनपुट के रूप में 2 चरणों के साथ एक बहुत ही सरल LSTM मॉडल का उपयोग करेगा:

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

 

उपयोग किया जाने वाला डेटासेट 10 नमूनों वाले CoreDNS के लिए 'go_memstats_sys_bytes' का मान है। हालांकि, चूंकि खिड़की की स्लाइडिंग खिड़की 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 सर्वर में कोई वर्कलोड नहीं है। हालाँकि, यह एक कार्यशील पाइपलाइन है जिसका उपयोग सही उत्पादन सर्वर से मैट्रिक्स लोड करने के लिए किया जा सकता है। तब देवोप्स स्वचालन की वास्तविक दुनिया की समस्या को हल करने के लिए मॉडल में सुधार किया जा सकता था।