پرش به مطلب اصلی

راهنمای ARQL: زبان کوئری آروان‌کلاد

ARQL یا Arvancloud Query Language، یک زبان کوئری اختصاصی بر پایه‌ی منطق بولی (Boolean) است. این زبان به شما امکان می‌دهد با ترکیب شرط‌های مختلف، از میان حجم انبوه داده‌ها، لاگ‌های مورد نظر خود را با دقت بالا جست‌وجو، فیلتر و تحلیل کنید.

ویژگی‌های کلیدی ARQL:

  • منطق ساده: ساختار عبارات مشابه منطق ریاضی و برنامه‌نویسی است.
  • عدم حساسیت به حروف (Case Insensitivity): به‌جز در موارد استفاده از Regex، این زبان نسبت به بزرگی و کوچکی حروف حساس نیست.
  • انعطاف‌پذیری: پشتیبانی از فیلدهای تودرتو (Nested Fields) و عملگرهای متنوع.

ساختار و قواعد نگارشی

هر کوئری در ARQL از ترکیب یک یا چند «عبارت شرطی» ساخته می‌شود. ساختار استاندارد هر عبارت به‌شکل زیر است:

<field> <comparison_operator> <value>

که در آن:

  • field: یک فیلد در لاگ (مانند resource.type)

  • comparison_operator: یک عملگر مقایسه‌ای (مانند ==, !=, =~)

  • value: مقدار مورد نظر (مانند "iaasServer")

است. برای نمونه:

resource.type == "iaasServer"

یا

resource.type == "iaasServer" AND ((severity == "ERROR") OR (severity == "error"))

یا

resource.type == "iaasServer" AND
severity != "ERROR" AND
payload.errorText !~ "^apache"

این کوئری تمام لاگ‌هایی را که مربوط به سرور ابری است و سطح severity آن‌ها برابر با "ERROR" نیست و پیام آن‌ها با کلمه "apache" شروع نمی‌شود را برمی‌گرداند.

عملگرهای مقایسه‌ای (Comparison Operators)

این عملگرها رابطه‌ی بین یک فیلد و یک مقدار را تعیین می‌کنند:

عملگرتوضیح
==مساوی بودن دقیق
!=نامساوی بودن
=~تطبیق با الگوی Regex
!~تطبیق نداشتن با الگوی Regex
> , >=بزرگ‌تر / بزرگ‌تر یا مساوی
< , <=کوچک‌تر / کوچک‌تر یا مساوی
INعضویت در یک مجموعه (Set)

برای نمونه:

  • یافتن مقادیر خالی: jsonPayload.field = NULL_VALUE
  • حذف مقادیر خالی: NOT jsonPayload.field = NULL_VALUE

عملگرهای منطقی (Boolean Operators)

برای ترکیب چند شرط با یک‌دیگر از عملگرهای زیر استفاده می‌شود:

عملگرتوضیحاولویت اجرا
NOT یا -نقیض شرط (شرط برقرار نباشد)۱ (بالاترین)
ORیا (برقراری حداقل یکی از شرط‌ها)۲
ANDو (برقراری تمام شرط‌ها)۳

برای جلوگیری از ابهام و تعیین دقیق اولویت‌ها، حتمن از پرانتز () استفاده کنید.

نمونه:

resource.type == "iaasServer" AND (severity == "ERROR" OR severity == "CRITICAL")

شناساگر فیلدها (Field Identifiers)

برای دسترسی به داده‌ها، از مسیر (Path) دقیق فیلد استفاده می‌شود. این مسیرها معمولن با نقطه (dot-separated) از هم جدا می‌شوند.

برای نمونه:

فیلدتوضیح
resource.typeنوع منبع (مانند iaasServer یا cdnDomain)
resource.labels.zoneمنطقه‌ی جغرافیایی که منبع در آن قرار دارد
resource.labels.project_idشناسه‌ی پروژه‌ای که لاگ متعلق به آن است
insertIdشناسه‌ی یکتا و منحصربه‌فرد هر لاگ
jsonPayload.httpRequest.protocolپروتکل استفاده‌شده در درخواست (مانند HTTP/1.1)
"payload.http."request/resource_idفیلد حاوی کاراکتر خاص (مانند /)

اگر بخشی از مسیر فیلد حاوی کاراکترهای خاص (مانند / یا فاصله) باشد، حتمن باید آن بخش را داخل دبل‌کوتیشن (" ") قرار دهید تا به‌درستی شناسایی شود.

انواع مقادیر (Values)

مقدارهایی که در شرط‌های خود برای مقایسه از آن‌ها استفاده می‌کنید، می‌توانند شامل انواع زیر باشند:

نوع مقدارمثالکاربرد
رشته (String)"iaasServer"مقادیر متنی که حتمن باید داخل " " باشند.
عدد (Number)404, 1.2مقادیر عددی (صحیح یا اعشاری)
مقدار خاصNULL_VALUEبرای بررسی وجود یا نبود یک فیلد (مقادیر تهی)
Regex"$foo.*bar^"الگوهای عبارات منظم برای جست‌وجوهای پیچیده

جست‌وجو با عبارات منظم (Regex)

ARQL از عملگرهای ~= (تطبیق) و ~! (نداشتن تطبیق) برای کار با الگوهای Regex پشتیبانی می‌کند.

مثال‌های کاربردی Regex

۱. تطبیق با رشته ساده:

jsonPayload.message =~ "timeout"

لاگ‌هایی که پیام آن‌ها شامل کلمه timeout باشد

۲. جست‌وجوی بدون حساسیت به حروف:

labels.subnetwork_name =~ "(?i)foo"

تطبیق با هر حالتی از حروف مانند FOO یا Foo

۳. تطبیق شامل علامت نقل قول:

jsonPayload.message =~ "field1=\"bar.*\""

برای درج نقل قول درون regex باید از \ استفاده شود

۴. استفاده از ^ و $:

شروع با مقدار خاص:

logName =~ "^foo"

پایان با مقدار خاص:

logName =~ "foo$"

۵. بررسی نداشتن تطابق:

labels.pod_name !~ "test-.*"

لاگ‌هایی که pod_name آن‌ها با -test شروع نمی‌شود

۶. ترکیب Boolean:

labels.env =~ ("^prod.*server" OR "^staging.*server")

مثال‌های واقعی از کوئری‌ها

در این بخش چند نمونه کوئری کاربردی آورده شده که می‌تواند برای بررسی سریع لاگ‌ها در سناریوهای مختلف مفید باشد.

  • مشاهده لاگ‌های CDN که خطای ۵۰۰ داشتند:
resource.type == "cdnDomain" AND httpRequest.status >= 500
  • جست‌وجوی لاگ‌هایی از سرور ابری که خطای خاصی نداشتند:
resource.type == "iaasServer" AND severity != "ERROR"
  • یافتن درخواست‌هایی که شامل کلمه‌ی timeout در پیام خطا هستند:
jsonPayload.errorText =~ "timeout"
  • حذف لاگ‌هایی که پیام‌شان با nginx شروع می‌شود:
payload.message !~ "^nginx"
  • **یافتن لاگ‌هایی که در آن‌ها نام پاد (pod) شامل عبارت **-api نیست:
labels.pod_name !~ "api-"
  • بررسی درخواست‌های HTTP فقط از مناطق ir-thr یا ir-teh:
resource.labels.zone IN ("ir-thr", "ir-teh")
  • یافتن لاگ‌هایی با مقدار null در فیلد payload.latency:
payload.latency = NULL_VALUE
  • ترکیب سرویس CDN، خطاهایی غیر از 404 و پیام حاوی کلمه‌ی cache:
resource.type == "cdnDomain" AND httpRequest.status != 404 AND jsonPayload.message =~ "cache"

جدول مرجع سریع (Cheat Sheet)

ساختار کلی کوئری

<field> <comparison_operator> <value>

نمونه:

resource.type == "cdnDomain"

عملگرهای مقایسه‌ای

عملگرعملکردمثال
==مساوی"severity == "ERROR
=!نامساویstatus != 404
~=تطبیق Regex"message =~ "^foo
~!عدم تطابق Regex"message !~ "bar$
>کوچکترlatency < 1000
=>کوچکتر یا مساویsize <= 512
<بزرگترduration > 50
=<بزرگتر یا مساویduration >= 10
INعضو در مجموعهzone IN ("ir-thr", "ir-teh")

عملگرهای منطقی

عملگرعملکردمثال
ANDوحذف‌شدنی: a==1 b==2
ORیانیاز به پرانتز در ترکیب دارد
NOTنقیضمی‌توان با - جایگزین کرد

فیلدهای پرتکرار

فیلدتوضیح
resource.typeنوع سرویس: cdnDomain, iaasServer
severityسطح هشدار: INFO, WARNING, ERROR
httpRequest.statusوضعیت HTTP
jsonPayload.messageپیام در بدنه JSON
labels.pod_nameنام پاد
resource.labels.zoneمنطقه‌ جغرافیایی سرویس

مقادیر خاص

مقدارکاربرد
"string"رشته
123, 3.14عدد
NULL_VALUEمقدار null در JSON
"^regex$"الگوی Regex

نمونه‌های سریع

هدفکوئری
خطای CDN"resource.type=="cdnDomain" AND severity=="ERROR
لاگ با کلمه timeout"jsonPayload.message =~ "timeout
فیلتر منطقه‌ایresource.labels.zone IN ("ir-thr", "ir-teh")
پیام بدون nginx"payload.message !~ "^nginx