رسم نقاط الوصول الخاصة بك للخدمات REST باستخدام grafana-infinity-datasource

عندما يتعلق الأمر بقدرتة الرؤية Grafana تكون الأداة المفتوحة المفتوحة المفتوحة التي يتم إستخدامها في التوضيح. ويتكون لوحة معرفية Grafana من أشكال مختلفة من التوضيحات التي تستدعي عامل قاعدة بيانات.
هذا ليس دائمًا الحال. أحيانًا بدلاً من تحميل البيانات من القاعدة البياناتية كما هي، قد ترغب في تنظيف البيانات. هذا الأمر لا يمكن الحصول عليه دائمًا من خلال الوظائف التي توفرها القاعدة. على سبيل المثال، قد ترغب في استعمال معلومات من نظام API خاص. هنا حيث يدخل بلوجراً grafana-infinity-datasource الإضافي. مع grafana-infinity-datasource، يمكنك إنشاء توضيحات بناءاً على الJSON، الXML، الCSV، وما إلى ذلك. يمكنك أن تقوم ب solicit HTTP ل API REST ورسم البيانات التي تلقاء إليه.

درس التعلم

لنفترض أن لدينا تطبيق eShop. سنقوم بإنشاء أداة بناء برنامج Python باستخدام FastAPI لإدارة المنتجات في eShop والحجم المشترك للشراء.

من خلال هذه الAPI سنضيف أعمال و أدخالات للحجم الشرائي.

Python

 

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
from datetime import datetime
 
app = FastAPI()
 
class Item(BaseModel):
    id: int
    name: str
    description: str = None
    price: float
 
class Purchase(BaseModel):
    price: float
    time: datetime
 
items = []
purchases = []
 
@app.post("/items/", response_model=Item)
def create_item(item: Item):
    items.append(item)
    return item
 
@app.get("/items/", response_model=List[Item])
def read_items():
    return items
 
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int):
    for item in items:
        if item.id == item_id:
            return item
    raise HTTPException(status_code=404, detail="Item not found")
 
@app.delete("/items/{item_id}", response_model=Item)
def delete_item(item_id: int):
    for idx, item in enumerate(items):
        if item.id == item_id:
            return items.pop(idx)
    raise HTTPException(status_code=404, detail="Item not found")
 
@app.post("/purchases/", response_model=Purchase)
def create_purchase(purchase: Purchase):
    purchases.append(purchase)
    return purchase
 
@app.get("/purchases/", response_model=List[Purchase])
def read_purchases():
    return purchases

نحن أيضًا بحاجة إلى إضافة FastAPI إلى requirements.txt:

Properties files

 

fastapi

سنقوم بتوزيع التطبيق من خلال Docker؛ لذلك سنقم بإنشاء Dockerfile:

Dockerfile

 

FROM python:3.11-slim
 
WORKDIR /app
 
COPY requirements.txt .
 
RUN pip install --no-cache-dir -r requirements.txt
 
COPY main.py main.py
 
EXPOSE 8000
 
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

ينبغي علينا المضي قدماً في التوجيهات البيانية لـ Grafana. بشكل أساسي لدينا مصدرين للبيانات مختلفين.
سيتم رؤية النموذج الأعمال في جدول وسيتم رؤية النموذج الشرائي من خلال رسم بيانات الوقت التي تتم بمقدمة الوقت.

سأستخدم Docker Compose لإعداد Grafana وأيضًا للتطبيق البياني البرمجي:

Dockerfile

 

version: '3.8'
 
services:
  app:
    build: .
    ports:
      - 8000:8000
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - ./grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=test
      - GF_SECURITY_ADMIN_PASSWORD=infinity
      - GF_INSTALL_PLUGINS=yesoreyeram-infinity-datasource

بشكل أساسي من خلال المتغير البياني في Docker سأفعل تمكين المودل infinity-datasource.

يمكننا تشغيل أجهزتنا بإيصال التالي:

Shell

 

docker compose up

يوجد Docker Compose V2 مع العديد من الميزات الجيدة.

يمكننا حاليًا تعبئة التطبيق ببعض البيانات:

Shell

 

$ curl -X POST "http://127.0.0.1:8000/purchases/" -H "Content-Type: application/json" -d '{"time": "2024-07-15T12:40:56","price":2.5}'
$ curl -X POST "http://127.0.0.1:8000/purchases/" -H "Content-Type: application/json" -d '{"time": "2024-07-15T12:41:56","price":4.0}'
$ curl -X POST "http://127.0.0.1:8000/purchases/" -H "Content-Type: application/json" -d '{"time": "2024-07-15T12:42:56","price":1.5}'
$ curl -X POST "http://127.0.0.1:8000/purchases/" -H "Content-Type: application/json" -d '{"time": "2024-07-15T12:43:56","price":3.5}'
 
$ curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"id": 1, "name": "Item 1", "description": "This is item 1", "price": 10.5, "tax": 0.5}'

سنتقدم بعد ذلك بإنشاء لوحة معلومات في Grafana.

رؤية واحدة للأعمال:

رؤية واحدة لحجم الشراء:

كما ترون في كل من الحالتين ، أستخدمت النقطة النهائي http://app:8000 وهي تطبيقنا والDNS الذي يمكن حل التطبيق Compose البياني.

هذا كل شيء! لقد رسمنا بياناتنا من خلال API REST بواسطة Grafana.

Source:
https://dzone.com/articles/plot-rest-endpoints-using-grafana-infinity-datasource