Help us understand the problem. What is going on with this article?

How to create /metrics on connexion

More than 1 year has passed since last update.

Overview

connexionとはOASを利用してAPIエンドポイントとpython関数をmapするためのpythonパッケージです。

https://connexion.readthedocs.io/en/latest/

Flaskベースで作成されており、flaskではdecorationで @app.route("/") 等と
エンドポイントを指定してHTTPリクエストと関数の関係を記述していたものを、OAS側に記載することで
ドキュメントと機能の実装を同時にできるという優れもの。

使い方やConnexionの説明は今回の趣旨では無いので詳しくは下記等を参照していただけると良い。

https://qiita.com/amuyikam/items/1454177a7030e3b3ce80

How to create /metrics for Prometheus

connexionはAPIのフロントエンドを作る上で非常に便利だが、そういう使い方なので
実際のAPIを提供しているものについて監視などもできると非常に便利。
昨今はPrometheusを使うのが流行っているようなので同様に作ってみようと思うと
なんらかのexporterを使う or 作ることになる。

flaskをそのまま使っているならばこちらを組み込み、flaskとしてhttp serverを起動する際に
フックしてやればいいのだが、残念ながらconnexionをフックするだけでは動作しない模様。
https://pypi.org/project/prometheus-flask-exporter/

swagger.ymlを読んでいるが故に起動プログラムの所にいきなりの記述はできない。
ということでswagger.ymlから呼ばれるプログラムを上手いことやってやる必要があるようだ。

Create swagger.yml

こんな風に /metrics パスを切り、ここをprometheus向けのexporter URLとする。

  /metrics:
    get:
      summary: Prometheus metrics exporter page
      description: Return metrics for prometheus 
      operationId: prometheus_exporter.Prometheus_exporter.showmetrics
      tags:
        - prometheus
      responses:
        default:
          $ref: '#/components/responses/example'

python method

呼ばれるプログラム自体はこんな風にしておく。
prometheus_clientをロードしREGISTRY等を登録する。
こうしておけばmetricsをええ具合に公開できるようになる。
どのようなデータを公開するかはprometheus_clientの仕様と
入れたいデータに依存するのでこれまた割愛。

#!/usr/bin/env python3
#  -*- coding: utf-8 -*-
from prometheus_client import generate_latest
from prometheus_client import Gauge
from prometheus_client import REGISTRY
from api import hpe


class Prometheus_exporter(object):
    registry = REGISTRY

    @classmethod
    def showmetrics(self):

        metrics = generate_latest(self.registry)
        return metrics, 200

ainamori
インフラエンジニア puppet -> chef -> Ansible -> python (?) <- イマココ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away