محمدرضا زارعی جلیانی
محمدرضا زارعی جلیانی
خواندن ۸ دقیقه·۱۰ روز پیش

استفاده از Zabbix API و مانیتور کردن قیمت ارزهای دیجیتال



مقدمه

در مستند قبل فرایندی را شرح دادیم که با استفاده از اسکریپت پایتون اطلاعات مربوط به دمای هوا به صورت لحظه ای دریافت و با استفاده از سرور زبیکس مقادیر دمای هوا مانیتور و هشدارهای مربوطه ایجاد میشد. این مستند در لینک زیر قابل دریافت است.

مانیتور کردن فاکتورهای مختلف یک وب سایت در زبیکس

در این مستند، فرآیند مانیتورینگ قیمت ۱۰ ارز دیجیتال برتر را با استفاده از زبیکس، Zabbix API، Zabbix و Grafana توضیح می‌دهیم. این راهکار به ما امکان می‌دهد قیمت ارزهای دیجیتال را به‌صورت لحظه‌ای رصد کرده و تغییرات آن‌ها را روی داشبوردهای Grafana نمایش دهیم.

توجه کنید که هدف از این کار آموزش مباحث مربوط به سرویس های مانیتورینگ زبیکس است و راهکارهای ارائه شده به هیچ عنوان به عنوان بهترین و موثرترین راهکار توصیه نمی گردد.

برای انجام این پروژه گام های زیر طی شده است.

1- نصب و راه اندازی سرور مانیتورینگ Zabbix

2- نصب و راه اندازی سرور مانیتورینگ Grafana

3- برقراری ارتباط بین سرورهای Zabbix و Grafana

4- ایجاد اسکریپت برای کار با Zabbix API

5- ایجاد داشبورد نمایش داده ها در محیط Grafana


گام های اول تا سوم مراحل ابتدایی و پایه ای این سناریو می باشد. اما در این داکیومنت از ارائه اطلاعات و نمایش جزئیات اجرای این گام ها به دو دلیل اساسی زیر پرهیز شده است:

1- آموزش نصب و راه اندازی سرویس های Zabbix و Grafana در محیط وب به وفور وجود دارد و ذکر این مراحل در این داکیومنت تنها موجب طولانی شدن متن و تکرار مکررات خواهد بود.

2- در آموزش قبل که لینک آن در ابتدای این داکیومنت ذکر شده است توضیحات کامل تری از پروسسه کار با محیط زبیکس درج شده است. در این قسمت تنها به ذکر مشخصات سرویس ها اکتفا می کنیم.

Zabbix Server: 192.168.25.128 - Hostname and username: zabbix - Password: 1qaz!QAZ

Grafana Server: 192.168.25.132 - Hostname and username: grafana - Password: 1qaz!QAZ


گام چهارم: ایجاد اسکریپت برای کار با Zabbix API

اسکریپت نوشته در این بخش خود شامل بخش های مختلفی است که به صورت مجزا ذکر و شرح داده می شود. برای در اختیار داشتن اسکریپت کامل تنها کافی است بخش های مختلف را به صورت پشت سر هم در یک فایل با پسوند py ذخیره کنید.

بخش اول: تعریف متغیرهای ابتدایی برای استفاده از اسکریپت

import requests
import json
import subprocess
ZABBIX_API_URL = "http://192.168.25.128/zabbix/api_jsonrpc.php"
ZABBIX_USERNAME = "Admin"
ZABBIX_PASSWORD = "zabbix"
ZABBIX_HOST_ID = "10084"
COINGECKO_API_URL = "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=10&page=1"
ZABBIX_SERVER = "192.168.25.128" # Zabbix server IP or hostname
ZABBIX_PORT = 10051 # Default Zabbix trapper port

در این اسکریپت ابتدا ماژولهای requests و json برای کار با api و ماژول subprocess برای تعامل با سیستم عامل و کنترل پراسس ها اضافه شده است. مورد کاربرد این ماژول در طی توضیح اسکریپت ذکر می شود.

همچنین اطلاعات مربوط به سرور زبیکس برای کار با Zabbix API در این قسمت نوشته شده است.

وظیفه دریافت اطلاعات ارزهای دیجیتال برای یکی از هاست های تعریف شده در زبیکس انتخاب شده است و در این قسمت Host ID مربوط به این هاست نیز ثبت شده است.

همچنین GET Request دریافت اطلاعات ارزهای دیجیتال از سایت coingecko در این بخش تعریف شده است. درک این Request بسیار ساده است. همانطور که مشاهده می شود اطلاعات ده ارز دیجیتال اول در مارکت با یک درخواست GET ساده دریافت می شود.



بخش دوم: تعریف تابع دریافت توکن از سرور زبیکس

def zabbix_login():
headers = {"Content-Type": "application/json"}
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"username": ZABBIX_USERNAME,
"password": ZABBIX_PASSWORD
},
"id": 1
}
response = requests.post(ZABBIX_API_URL, data=json.dumps(data), headers=headers)
outputs = response.json()
token = outputs['result']
return token

برای کار با Zabbix API باید اطلاعات Token معتبر در اختیار داشت. برای داشتن توکن دو راه وجود دارد. راه اول دریافت این توکن از محیط وب و ثبت در اسکریپت است. اما به دو دلیل این کار توصیه نمی شود. دلیل اول این است که در این آموزش ما در حال تلاش برای کار با Zabbix API هستیم و بهتر است تلاش شود تا بدون استفاده و کمک از محیط وب این کار انجام شود. اما در صورتی که اطلاعات توکن از محیط وب زبیکس دریافت و در اسکریپت ثبت شود ممکن است در اینده این توکن منقضی و عملکرد اسکریپت دچار وقفه شود. پس بهتر است هر بار توکن جدید دریافت شود.

برای دریافت توکن از متد user.login استفاده شده است و اطلاعات لاگین شامل نام کاربری و رمز عبور با استفاده از متد POST برای URL Zabbix API ارسال شده است.

در نهایت خروجی json دریافت شده شامل فیلد result است که رشته ای از کاراکترها است که به عنوان توکن باید در درخواست های بعدی برای سرور زبیکس ارسال شود.




بخش سوم: دریافت لیست آیتم های هاست زبیکس

در این بخش با استفاده از یک تابع لیست ایتم های تعریف شده در هاست 10084 دریافت و ذخیره می شود. دلیل این کار این است که در هر بار اجرای اسکریپت نام ایتم هایی که قرار است ایجاد شود با این لیست چک شود و در صورت تکراری بودن تنها عمل آپدیت انجام شود تا از بروز خطای تعریف ایتم تکراری جلوگیری شود.

def get_zabbix_item(auth_token, key):
headers = {"Content-Type": "application/json"}
payload = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"hostids": ZABBIX_HOST_ID,
"filter": {
"key_": key
}
},
"auth": auth_token,
"id": 2
}
response = requests.post(ZABBIX_API_URL, data=json.dumps(payload), headers=headers)
return response.json()



بخش چهارم: ساخت آیتم در زبیکس

در این بخش با استفاده از لیست ارزهای دیجیتال دریافت شده در بخش دوم، برای هر ارز دیجیتال یک آیتم در هاست 10084 ساخته می شود.

def create_zabbix_item(auth_token, coin_name, coin_symbol):
headers = {"Content-Type": "application/json"}
payload = {
"jsonrpc": "2.0",
"method": "item.create",
"params": {
"name": f"{coin_name} Price",
"key_": f"crypto_price_{coin_symbol}",
"hostid": ZABBIX_HOST_ID,
"type": 2, # Zabbix Trapper
"value_type": 0, # Numeric (float)
"delay": "30s", # Update interval
"history": 3600,
"trends": 86400, # Store 365 trends
"units": "USD",
"interfaceid": 0 # Corrected to 0
},
"auth": auth_token,
"id": 3
}
response = requests.post(ZABBIX_API_URL, data=json.dumps(payload), headers=headers)
return response.json()


توضیح این بخش بسیار ساده است. همانطور که مشاهده می شود اطلاعات مورد نیاز برای ساخت هر ایتم که به صورت معمول در محیط وب به صورت دستی در فیلدهای مربوطه وارد می شود در این بخش در قالب یک درخواست POST و در بخش payload برای سرور زبیکس ارسال می شود. متد مورد استفاده برای این کار item.create است و توکن دریافت شده در ابتدا نیز برای سرور ارسال می شود.




بخش پنجم: ارسال داده ها به سرور Zabbix

def send_to_zabbix_trapper(host, key, value):
# Use zabbix_sender to send data to Zabbix
command = [
"zabbix_sender",
"-z", ZABBIX_SERVER,
"-p", str(ZABBIX_PORT),
"-s", host,
"-k", key,
"-o", str(value)
]
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return result.stdout.decode()

این تابع برای ارسال داده ها به سرور Zabbix مورد استفاده قرار می گیرد و سه مقدار ورودی دریافت میکند. نام هاست و کلید مربوط به ایتم و مقدار ایتم.

تابع subprocess.run برای اجرای دستور سیستم عامل مورد استفاده قرار می گیرد و خروجی استاندارد دستور در بخش stdout و خطاهای احتمالی رخ داده در stderr خروجی استاندارد خطا ثبت می شود. در نهایت با استفاده از تابع decode خروجی استاندارد به رشته (string) تبدیل می شود. در صورتی که در این بخش نیاز به توضیح بیشتری بود در بخش نظرات اعلام کنید تا به صورت کاملتر در خدمت شما باشم.




بخش ششم: دریافت یک دیکشنری کامل از اطلاعات ارزهای دیجیتال

def fetch_cryptocurrencies():
response = requests.get(COINGECKO_API_URL)
return response.json()

در این بخش یک دیکشنری کامل از اطلاعات ده ارز دیجیتال اول دریافت می شود.



بخش هفتم: تابع main

def main():
# Log in to Zabbix API
auth_token = zabbix_login()
cryptocurrencies = fetch_cryptocurrencies()
for crypto in cryptocurrencies:
coin_name = crypto["name"]
coin_symbol = crypto["symbol"]
price = crypto["current_price"]
item_key = f"crypto_price_{coin_symbol}"
# Check if the item already exists
item_exists = get_zabbix_item(auth_token, item_key)
if not item_exists.get("result"):
# Item does not exist, create it
item_result = create_zabbix_item(auth_token, coin_name, coin_symbol)
if item_result.get("result"):
print(f"Created {coin_name} ({coin_symbol}): {item_result}")
else:
print(f"Failed to create {coin_name} ({coin_symbol}): {item_result}")
else:
print(f"Item for {coin_name} ({coin_symbol}) already exists. Skipping creation.")
# Send price data to Zabbix using zabbix_sender
send_result = send_to_zabbix_trapper("Zabbix server", item_key, price)
print(f"Sent {coin_name} ({coin_symbol}) price to Zabbix: {send_result}")
if __name__ == "__main__":
main()

بخش تابع main به سادگی تنها شامل دستورات شرط موجود بودن ایتم از قبل و اجرای تابع دریافت توکن و لیست ارزهای دیجیتال و ساخت ایتم می باشد. در خط انتهایی نیز تابع main اجرا می شود.




با هر بار اجرای این اسکریپت، اطلاعات ده ارز دیجیتال دریافت و ضمن ایجاد ایتم برای هر ارز، قیمت آنها نیز در دیتابیس سرور زبیکس ذخیره می شود.

برای اینکه این اسکریپت به صورت خودکار هر پنج دقیقه یک بار اجرا شود ما از دستور cron در لینوکس استفاده کرده ایم:

crontab -e
*/5 * * * * /usr/bin/python3 /path/to/your/script.py

شما می توانید از هر نوع task scheduler مدنظر خود استفاده کنید.


گام پنجم: ایجاد داشبورد نمایش داده ها در سرور Grafana

برای داشتن یک داشبورد که اطلاعات ارزهای دیجیتال را نمایش دهد وارد بخش ساخت داشبورد شده و اطلاعات ده ارز دیجیتال را به شکل زیر وارد می کنیم:

Group: Zabbix servers

Host: /.*/

Item tag: crypto

Item: <Your coin name>

توجه کنید که ما برای هر ایتم به صورت دستی tag تعریف کرده ایم. همچنین نام گروه سرور در سناریو شما ممکن است متفاوت باشد.

این مرحله برای هر ده ارز می بایست تکرار شود.

در نهایت داشبورد خود را به شکل دلخواه چیدمان کنید.


پی‌نوشت: این دومین مقاله‌ای هست که در ویرگول نوشتم و امیدوارم برای شما مفید باشه. هدفم اینه که چیزهایی که یاد می‌گیرم رو به اشتراک بذارم تا هم به دیگران کمک کنم و هم خودم بیشتر یاد بگیرم. به نظرم وقتی تجربه‌هامون رو با بقیه درمیون می‌ذاریم، هم فرصت رشد برای خودمون ایجاد می‌شه و هم می‌تونیم به دیگران کمک کنیم تا راحت‌تر چالش‌هاشون رو حل کنن. اگر نظری یا پیشنهادی دارید، خوشحال می‌شم بدونم.

به تاریخ: 1403.11.14










ارزهای دیجیتالzabbixmonitoring
شاید از این پست‌ها خوشتان بیاید