پرش به محتوا
آرش حاتمی

arvancloud/ ar-prometheus-exporter

سال توسعه: ۱۴۰۲ متن‌باز

پایش سرویس‌ها و هزینه‌های ابرآروان با Prometheus

اکسپورتر Go برای دریافت آمار CDN، فضای ابری و هزینه‌های ابرآروان؛ با جمع‌آوری دوره‌ای داده، پشتیبانی از چند حساب مالی و داشبوردهای Grafana.

برای دیدن وضعیت سرویس‌های ابری در کنار مانیتورینگ زیرساخت، به راهی نیاز دارید که آمار پنل ارائه‌دهنده را وارد Prometheus کند. تعداد درخواست‌های CDN، حجم باکت‌ها و موجودی کیف پول هر کدام بخشی از همین تصویر هستند؛ جمع‌کردن آن‌ها در یک داشبورد، بررسی مصرف و هزینه را ساده‌تر می‌کند.

پروژهٔ Arvancloud Prometheus Exporter داده‌ها را از API ابرآروان می‌گیرد و به شکل متریک منتشر می‌کند. برنامه با Go نوشته شده و برای CDN، فضای ابری یا Object Storage و بخش مالی یا Billing جمع‌آورندهٔ جداگانه دارد. می‌توانید فقط محصولات موردنیاز را فعال کنید و خروجی را در Prometheus و Grafana ببینید.

چه اطلاعاتی جمع‌آوری می‌شود؟

  • CDN: تعداد درخواست‌ها، ترافیک، بازدیدکنندگان یکتا، وضعیت پاسخ‌های HTTP، توزیع جغرافیایی درخواست و ترافیک، زمان پاسخ و IPهای دارای بیشترین درخواست. نام دامنه در برچسب domain قرار می‌گیرد.
  • فضای ابری: تعداد آبجکت‌ها و آبجکت‌های Multipart، اندازهٔ باکت، حجم آپلود و دانلود، تعداد عملیات موفق و زمان آخرین به‌روزرسانی آمار. برچسب bucket باکت‌ها را از هم جدا می‌کند.
  • Billing: موجودی و اعتبار هدیهٔ کیف پول، هزینه و تخفیف دورهٔ گزارش، تفکیک هزینه‌ها، اطلاعات دورهٔ مالی و مصرف منابع. با تعریف چند Workspace، برچسب account مشخص می‌کند هر مقدار متعلق به کدام حساب است.

مثال‌های این نوشته برای نسخهٔ v2.4.0 هستند که پشتیبانی از Billing چندحسابی را دارد. PaaS/CaaS و IaaS در فهرست برنامه‌های آیندهٔ مخزن آمده‌اند و در این نسخه جمع‌آورندهٔ اختصاصی ندارند.

روش کار: دریافت دوره‌ای، پاسخ از حافظه

اکسپورتر هنگام شروع، داده‌ها را از API دریافت می‌کند و پس از آن در فاصله‌های زمانی مشخص به‌روزرسانی را ادامه می‌دهد. نتیجه در حافظهٔ نهان نگه‌داری می‌شود؛ درخواست Prometheus آخرین دادهٔ موجود را می‌خواند و باعث دریافت مجدد از API نمی‌شود.

مسیر /metrics خروجی محصولات فعال را یک‌جا ارائه می‌دهد. مسیرهای /metrics/cdn، /metrics/storage و /metrics/billing نیز برای دریافت جداگانهٔ متریک‌های هر محصول فعال در دسترس‌اند. این تفکیک اجازه می‌دهد برای محصولات مختلف Job و فاصلهٔ Scrape متفاوت تعریف کنید.

دو زمان‌بندی را از هم جدا در نظر بگیرید:

  • interval فاصلهٔ دریافت داده از API، بر حسب ثانیه است.
  • scrape_interval در Prometheus فاصلهٔ خواندن خروجی اکسپورتر است.

در پیاده‌سازی این نسخه، حداقل و مقدار پیش‌فرض فاصلهٔ دریافت برای CDN برابر با ۳۰ ثانیه و برای Storage و Billing برابر با ۳۰۰ ثانیه است. فقط مقادیر بزرگ‌تر از این حد، فاصله را تغییر می‌دهند. بنابراین Scrape سریع‌تر یا نوشتن interval: 10، اطلاعات Billing را هر ۱۰ ثانیه تازه نمی‌کند.

آماده‌سازی تنظیمات

برای اجرای نمونه به Docker، دسترسی شبکه به API ابرآروان و کلید API دارای دسترسی به منابع انتخاب‌شده نیاز دارید. روش ساخت کلید در مستندات کلید API ابرآروان آمده است.

فایلی به نام config.yml بسازید. نمونهٔ زیر هر سه محصول را فعال می‌کند و ساختار آن بر پایهٔ فایل تنظیمات مخزن است:

token: "apikey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

products:
  cdn:
    enable: true
    interval: 30
    domains:
      - example.com
    period: 3h

  storage:
    enable: true
    interval: 300
    buckets:
      - example-bucket

  billing:
    enable: true
    interval: 300
    accounts:
      - name: production

دامنه، نام باکت و توکن در این مثال فرضی‌اند؛ آن‌ها را با مقادیر حساب خود جایگزین کنید. برای محصولی که استفاده نمی‌کنید، enable: false بگذارید. فایل حاوی کلید API را در مخزن عمومی منتشر نکنید.

گزینهٔ period: 3h بازهٔ گزارش CDN را روی سه ساعت اخیر می‌گذارد؛ این مقدار با فاصلهٔ دریافت گزارش فرق دارد. domains و buckets نیز فهرست منابعی هستند که قرار است پایش شوند.

توکن‌های جدا و چند حساب مالی

اگر زیر هر محصول token تعریف کنید، همان مقدار جایگزین توکن سراسری می‌شود. در Billing، توکن هر عضو accounts اولویت بالاتری دارد؛ در نبود آن، توکن بخش Billing و سپس توکن سراسری استفاده می‌شود. در نمونهٔ بالا، حساب production از همان کلید سراسری استفاده می‌کند.

برای پایش دو Workspace، بخش accounts را به این شکل تغییر دهید:

accounts:
  - name: production
    token: "apikey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  - name: staging
    token: "apikey yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"

این بخش باید زیر products.billing بماند. برای هر حساب نامی یکتا و ثابت انتخاب کنید؛ نام تکراری باعث خطای بارگذاری تنظیمات می‌شود. هر حساب دریافت‌کنندهٔ دوره‌ای و حافظهٔ نهان خودش را دارد و نام آن در برچسب account تمام متریک‌های مالی قرار می‌گیرد.

نشانی پیش‌فرض API مالی https://napi.arvancloud.ir/resid است. در صورت نیاز می‌توان آن را با base_url در بخش Billing یا برای یک حساب مشخص تغییر داد. جزئیات اولویت تنظیمات در کد پیکربندی مشخص است.

اجرا با Docker

از دایرکتوری حاوی فایل config.yml اجرا کنید:

docker run -d \
  --name arvancloud-exporter \
  -p 127.0.0.1:9786:9786 \
  -v "$(pwd)/config.yml:/app/config.yml:ro" \
  r1cloud/exporter:v2.4.0

فایل تنظیمات به‌صورت فقط‌خواندنی در مسیر پیش‌فرض /app/config.yml قرار می‌گیرد. پورت پیش‌فرض سرویس ۹۷۸۶ است و در این مثال فقط روی Loopback میزبان منتشر می‌شود. برای بررسی خروجی از همان میزبان:

curl --fail http://127.0.0.1:9786/metrics
curl --fail http://127.0.0.1:9786/metrics/billing
docker logs arvancloud-exporter

طبق نقطهٔ ورود برنامه، گزینه‌های -config، -port و -path به‌ترتیب مسیر فایل تنظیمات، آدرس گوش‌دادن و مسیر پایهٔ متریک‌ها را تغییر می‌دهند. سرور داخلی HTTP است و احراز هویت ندارد؛ دسترسی به آن را متناسب با شبکهٔ مانیتورینگ تنظیم کنید، به‌ویژه چون خروجی می‌تواند اطلاعات هزینه و منابع حساب را نشان دهد.

اتصال به Prometheus

اگر Prometheus مستقیماً روی همان میزبان اجرا می‌شود، این Job را به فهرست scrape_configs اضافه کنید:

scrape_configs:
  - job_name: arvancloud
    scrape_interval: 30s
    metrics_path: /metrics
    static_configs:
      - targets: ["127.0.0.1:9786"]

اگر Prometheus در کانتینر جداگانه است، 127.0.0.1 به همان کانتینر اشاره می‌کند. در آن حالت از شبکهٔ مشترک Docker و نام سرویس اکسپورتر، یا نشانی قابل‌دسترسی میزبان استفاده کنید. برای دریافت فقط یک محصول، مثلاً Billing، مقدار metrics_path را به /metrics/billing تغییر دهید.

چند پرس‌وجوی کاربردی

تعداد کل درخواست‌های یک دامنه در بازهٔ گزارش تنظیم‌شده:

arvancloud_cdn_requests{domain="example.com", cache_type="total"}

اندازهٔ یک باکت بر حسب بایت:

arvancloud_storage_bucket_size{bucket="example-bucket"}

موجودی کیف پول حساب production، با انتخاب واحد ریال و تبدیل آن به تومان:

arvancloud_billing_wallet_balance{account="production", currency="irr"} / 10

این متریک‌ها Gauge هستند. برای دیدن تعداد درخواست‌های بازهٔ CDN یا هزینهٔ دورهٔ مالی، مقدار مستقیم متریک را بخوانید؛ استفاده از rate() یا increase() مانند Counterهای تجمعی، معنای موردنظر را نمی‌دهد. هنگام جمع‌زدن مقادیر مالی نیز حساب و واحد پول را صریح انتخاب کنید.

داشبوردهای Grafana

پروژه برای شروع، داشبوردهای آماده معرفی می‌کند:

داشبورد Billing انتخاب‌گر حساب دارد و بخش‌هایی برای کیف پول، هزینه‌ها، دورهٔ مالی و مصرف منابع ارائه می‌دهد. قالب آماده برای نمایش مبالغ ریالی به تومان تنظیم شده است؛ اگر حساب با ارز دیگری کار می‌کند، فیلتر ارز و واحد نمایش پنل‌ها را متناسب با آن تغییر دهید.

تازگی داده و نکات عملی

پاسخ موفق /metrics یا مقدار up = 1 تنها نشان می‌دهد Prometheus توانسته خروجی اکسپورتر را بخواند. داده‌های API از حافظه ارائه می‌شوند و پس از خطای دریافت ممکن است مقدار قبلی همچنان دیده شود. مسیر /health نیز فقط ok برمی‌گرداند و آزمون تازگی داده نیست.

برای Billing، متریک arvancloud_billing_api_up وضعیت آخرین دریافت اصلی را نشان می‌دهد و arvancloud_billing_last_success_timestamp_seconds زمان آخرین دریافت موفق را نگه می‌دارد. با فاصلهٔ ۳۰۰ ثانیه‌ای مثال، عبارت زیر حساب‌هایی را پیدا می‌کند که بیش از پانزده دقیقه از آخرین دریافت موفقشان گذشته است:

time() - arvancloud_billing_last_success_timestamp_seconds > 900

طبق پیاده‌سازی جمع‌آورندهٔ Billing، خطای دریافت جزئیات usage-items غیرحیاتی حساب می‌شود؛ بنابراین موفقیت متریک بالا، به‌تنهایی تازگی تمام جزئیات مصرف منابع را تضمین نمی‌کند. همچنین نبود کامل یک سری را با این مقایسه نمی‌توان تشخیص داد و باید وجود متریک حساب‌های موردانتظار را جداگانه پایش کرد.

چند نکتهٔ دیگر در استفاده از این نسخه اهمیت دارد:

  • اولین دریافت مهم است. اگر دریافت اولیهٔ یک دامنه، باکت یا حساب مالی شکست بخورد، جمع‌آورندهٔ آن وارد حلقهٔ دوره‌ای نمی‌شود. لاگ شروع را بررسی کنید و پس از رفع مشکل دسترسی یا API، اکسپورتر را دوباره راه‌اندازی کنید.
  • آمار Storage لحظه‌ای نیست. طبق راهنمای پروژه، داده‌های مصرف باکت هر پنج دقیقه به‌روزرسانی می‌شوند.
  • بعضی متریک‌های CDN به پلن وابسته‌اند. گزارش IPهای دارای بیشترین درخواست برای پلن حرفه‌ای و بالاتر در دسترس است.
  • جزئیات مصرف مالی تعداد سری‌ها را افزایش می‌دهد. متریک‌های usage_* برچسب‌هایی مانند resource_id، product_name، metric و region دارند؛ تعداد منابع و انواع مصرف در حجم دادهٔ ذخیره‌شده در Prometheus اثر می‌گذارد.

این اکسپورتر راهی برای آوردن آمار سرویس‌ها و هزینه‌های ابرآروان به سامانهٔ مانیتورینگ موجود است. کد با مجوز MIT منتشر شده و نمونه‌های استقرار بیشتر در دایرکتوری deployment در دسترس‌اند.