<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Copyright 2020 The TensorFlow IO Authors.
Step1:  Prometheus サーバーからメトリックを読み込む
<table class="tfo-notebook-buttons" align="left">
  <td><a target="_blank" href="https
Step2:  CoreDNS と Prometheus のインストールとセットアップ
デモ用に、9053番ポートをローカルで開放し、DNS クエリを受信するための CoreDNS サーバーとスクレイピングのメトリックを公開するために9153番ポート (デフォルト) を開放します。以下は CoreDNS の基本的な Corefile 構成であり、ダウンロードできます。
.
Step3:  次に、Prometheus サーバーをセットアップし、Prometheus を使用して、上記の9153番ポートで公開されている CoreDNS メトリックを取得します。また、構成用のprometheus.ymlファイルはダウンロードできます。
Step4:  アクティビティを表示するためには、digコマンドを使用して、セットアップされている CoreDNS サーバーに対していくつかの DNS クエリを生成できます。
Step5:  CoreDNS サーバーのメトリックが Prometheus サーバーによりスクレイピングされ、TensorFlow で使用する準備ができました。
CoreDNS メトリックのデータセットを作成し、TensorFlow で使用する
PostgreSQL サーバーから利用可能な CoreDNS メトリックのデータセットを作成します。これは、tfio.experimental.IODataset.from_prometheusを使用して実行できます。少なくとも次の 2 つの引数が必要です。 <code>query</code>はメトリックを選択するため Prometheus サーバーに渡され、<code>length</code>は Dataset に読み込む期間です。
"coredns_dns_request_count_total"と"5"(秒)から始めて、以下のデータセットを作成します。チュートリアルの前半で 2 つの DNS クエリが送信されたため、"coredns_dns_request_count_total"のメトリックは時系列の終わりに"2.0"になると予想されます。
Step6:  データセットの仕様をさらに見てみましょう。
```
(
  TensorSpec(shape=(), dtype=tf.int64, name=None),
  {
    'coredns'
Step7:  作成されたDatasetは、トレーニングまたは推論のために直接tf.kerasに渡す準備ができています。
モデルトレーニングにデータセットを使用する
メトリクスのデータセットを作成すると、モデルのトレーニングや推論のためにデータセットをtf.kerasに直接渡すことができます。
デモのために、このチュートリアルでは、1 つの特徴と 2 つのステップを入力とする非常に単純な LSTM モデルを使用します。
Step8:  使用するデータセットは、10 サンプルの CoreDNS の「go_memstats_sys_bytes」の値です。ただし、window = n_stepsおよびshift = 1のスライディングウィンドウが形成されるため、追加のサンプルが必要です (2 つの連続する要素の場合、最初のサンプルはxで、2 番目はyと見なされます) 。合計は10 + n_steps - 1 + 1 = 12 秒です。
また、データ値は[0、1]にスケーリングされています。
<ASSISTANT_TASK:>
Python Code:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Explanation: Copyright 2020 The TensorFlow IO Authors.
End of explanation
import os
try:
  %tensorflow_version 2.x
except Exception:
  pass
!pip install tensorflow-io
from datetime import datetime
import tensorflow as tf
import tensorflow_io as tfio
Explanation: Prometheus サーバーからメトリックを読み込む
<table class="tfo-notebook-buttons" align="left">
  <td><a target="_blank" href="https://www.tensorflow.org/io/tutorials/prometheus"><img src="https://www.tensorflow.org/images/tf_logo_32px.png"> TensorFlow.orgで表示</a></td>
  <td><a target="_blank" href="https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ja/io/tutorials/prometheus.ipynb"><img src="https://www.tensorflow.org/images/colab_logo_32px.png"> Google Colab で実行</a></td>
  <td><a target="_blank" href="https://github.com/tensorflow/docs-l10n/blob/master/site/ja/io/tutorials/prometheus.ipynb"><img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png">GitHub でソースを表示{</a></td>
      <td><a href="https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ja/io/tutorials/prometheus.ipynb"><img src="https://www.tensorflow.org/images/download_logo_32px.png">ノートブックをダウンロード/a0}</a></td>
</table>
注: このノートブックは python パッケージの他、sudo apt-get installを使用してサードパーティのパッケージをインストールします。
概要
このチュートリアルでは、CoreDNS メトリクスを Prometheus サーバーからtf.data.Datasetに読み込み、tf.kerasをトレーニングと推論に使用します。
CoreDNS は、サービスディスカバリに重点を置いた DNS サーバーであり、Kubernetes クラスタの一部として広くデプロイされています。そのため、通常、開発オペレーションによって綿密に監視されています。
このチュートリアルでは、開発者向けに機械学習による運用の自動化の例を紹介します。
セットアップと使用法
必要な tensorflow-io パッケージをインストールし、ランタイムを再起動する
End of explanation
!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
# Run `./coredns` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./coredns &')
Explanation: CoreDNS と Prometheus のインストールとセットアップ
デモ用に、9053番ポートをローカルで開放し、DNS クエリを受信するための CoreDNS サーバーとスクレイピングのメトリックを公開するために9153番ポート (デフォルト) を開放します。以下は CoreDNS の基本的な Corefile 構成であり、ダウンロードできます。
.:9053 {
  prometheus
  whoami
}
インストールの詳細については、CoreDNS のドキュメントを参照してください。
End of explanation
!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
# Run `./prometheus` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./prometheus &')
Explanation: 次に、Prometheus サーバーをセットアップし、Prometheus を使用して、上記の9153番ポートで公開されている CoreDNS メトリックを取得します。また、構成用のprometheus.ymlファイルはダウンロードできます。
End of explanation
!sudo apt-get install -y -qq dnsutils
!dig @127.0.0.1 -p 9053 demo1.example.org
!dig @127.0.0.1 -p 9053 demo2.example.org
Explanation: アクティビティを表示するためには、digコマンドを使用して、セットアップされている CoreDNS サーバーに対していくつかの DNS クエリを生成できます。
End of explanation
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']))
Explanation: CoreDNS サーバーのメトリックが Prometheus サーバーによりスクレイピングされ、TensorFlow で使用する準備ができました。
CoreDNS メトリックのデータセットを作成し、TensorFlow で使用する
PostgreSQL サーバーから利用可能な CoreDNS メトリックのデータセットを作成します。これは、tfio.experimental.IODataset.from_prometheusを使用して実行できます。少なくとも次の 2 つの引数が必要です。 <code>query</code>はメトリックを選択するため Prometheus サーバーに渡され、<code>length</code>は Dataset に読み込む期間です。
"coredns_dns_request_count_total"と"5"(秒)から始めて、以下のデータセットを作成します。チュートリアルの前半で 2 つの DNS クエリが送信されたため、"coredns_dns_request_count_total"のメトリックは時系列の終わりに"2.0"になると予想されます。
End of explanation
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']))
Explanation: データセットの仕様をさらに見てみましょう。
```
(
  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フィールドは、次のように展開された python dict です。
"job_name": {
  "instance_name": {
    "metric_name": value,
  },
}
上記の例では、'coredns'はジョブ名、'localhost:9153'はインスタンス名、'coredns_dns_request_count_total'はメトリック名です。使用する Prometheus クエリによっては、複数のジョブ/インスタンス/メトリックが返される可能性があることに注意してください。これは、データセットの構造で python dict が使用されている理由でもあります。
別のクエリ"go_memstats_gc_sys_bytes"を例として見てみましょう。CoreDNS と Prometheus はどちらも Golang で記述されているため、"go_memstats_gc_sys_bytes"メトリックは、"coredns"ジョブと"prometheus"ジョブの両方で使用できます。
注: このセルは、最初に実行したときにエラーになる場合があります。もう一度実行すると、パスします。
End of explanation
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')
Explanation: 作成されたDatasetは、トレーニングまたは推論のために直接tf.kerasに渡す準備ができています。
モデルトレーニングにデータセットを使用する
メトリクスのデータセットを作成すると、モデルのトレーニングや推論のためにデータセットをtf.kerasに直接渡すことができます。
デモのために、このチュートリアルでは、1 つの特徴と 2 つのステップを入力とする非常に単純な LSTM モデルを使用します。
End of explanation
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)
Explanation: 使用するデータセットは、10 サンプルの CoreDNS の「go_memstats_sys_bytes」の値です。ただし、window = n_stepsおよびshift = 1のスライディングウィンドウが形成されるため、追加のサンプルが必要です (2 つの連続する要素の場合、最初のサンプルはxで、2 番目はyと見なされます) 。合計は10 + n_steps - 1 + 1 = 12 秒です。
また、データ値は[0、1]にスケーリングされています。
End of explanation
<END_TASK>