أدوار المجمّع
- الوكيل - تجمع مثيلات الوكيل البيانات على الأطراف، مثل الخوادم أو عُقد Kubernetes، أو تستقبل الأحداث مباشرةً من التطبيقات المزوّدة بـ OpenTelemetry SDK. وفي الحالة الأخيرة، يعمل مثيل الوكيل مع التطبيق أو على المضيف نفسه الذي يعمل عليه التطبيق (مثل sidecar أو DaemonSet). ويمكن للوكلاء إرسال بياناتهم مباشرةً إلى ClickHouse أو إلى مثيل بوابة. وفي الحالة الأولى، يُشار إلى ذلك باسم نمط نشر الوكيل.
- البوابة - توفّر مثيلات البوابة خدمة مستقلة، على سبيل المثال على هيئة عملية نشر في Kubernetes، وعادةً ما تكون لكل عنقود أو لكل مركز بيانات أو لكل منطقة. وتستقبل هذه المثيلات الأحداث من التطبيقات (أو من collectors أخرى تعمل كوكلاء) عبر OTLP endpoint واحد. وعادةً ما تُنشر مجموعة من مثيلات البوابة، مع استخدام load balancer جاهز لتوزيع الحمل بينها. وإذا كانت جميع الوكلاء والتطبيقات ترسل إشاراتها إلى نقطة النهاية الواحدة هذه، فغالبًا ما يُشار إلى ذلك باسم نمط نشر البوابة.
نشر المُجمِّع
- ClickStack المُدار
- ClickStack مفتوح المصدر
نوصي باستخدام توزيعة ClickStack الرسمية للمُجمِّع لدور البوابة عند الإرسال إلى Managed ClickStack، كلما أمكن ذلك. إذا اخترت استخدام مُجمِّعك الخاص، فتأكد من أنه يتضمن ClickHouse exporter.يمكن نشر المُجمِّع إما عبر Helm (الموصى به لبيئات Kubernetes) أو عبر Docker. يتضمّن مخطط Helm الرسمي لـ ClickStack مخطط Helm الخاص بـ OpenTelemetry Collector من المصدر الأصلي بوصفه مخططًا فرعيًا، مع تهيئة مسبقة لصورة توزيعة ClickStack—راجع دليل نشر ClickStack عبر Helm إذا كنت ترغب في تثبيت المجموعة الكاملة بما فيها HyperDX. أما لنشر المُجمِّع بصورة مستقلة، فيمكن استخدام المخطط الأصلي مباشرةً مع صورة ClickStack، كما هو موضح أدناه.يتم تهيئة نسخة ClickHouse المستهدفة عبر متغيرات البيئة يدعم توزيع ClickStack من OTel مُجمِّع توسيع التهيئة الأساسية من خلال تركيب ملف تهيئة مخصص وتعيين متغير بيئة.لإضافة receivers أو processors أو pipelines مخصصة:النشر باستخدام المُجمِّع المستقل:بالنسبة إلى التهيئات الأكثر تعقيدًا، راجع التهيئة الافتراضية لمجمّع ClickStack ووثائق مُصدِّر ClickHouse.للاطلاع على تفاصيل حول إعداد مكوّنات OTel مُجمِّع، بما في ذلك
- Helm
- Docker
أضف مستودع Helm المصدر لـ OpenTelemetry:أنشئ ملف ثبّت الـ chart:في عمليات النشر الخاصة ببيئات الإنتاج، نوصي بتخزين
values.yaml لإعداد صورة ClickStack وبيانات اعتماد Managed ClickStack:CLICKHOUSE_PASSWORD في Kubernetes secret والإشارة إليه عبر extraEnvsFrom بدلًا من تضمين القيمة مباشرة.CLICKHOUSE_ENDPOINT وCLICKHOUSE_USER وCLICKHOUSE_PASSWORD. يجب أن يكون CLICKHOUSE_ENDPOINT هو عنوان HTTP endpoint الكامل لـ ClickHouse Cloud، بما يشمل البروتوكول والمنفذ—على سبيل المثال: https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443.للاطلاع على تفاصيل استرداد بيانات اعتماد Managed ClickStack الخاصة بك، انظر هنا.مستخدم الإنتاجيجب استخدام مستخدم لديه بيانات الاعتماد المناسبة في بيئة الإنتاج.
تعديل التهيئة
تهيئة نسخة Managed ClickStack
يمكن تهيئة OpenTelemetry Collector للاتصال بنسخة Managed ClickStack عبر متغيرات البيئةCLICKHOUSE_ENDPOINT وCLICKHOUSE_USER وCLICKHOUSE_PASSWORD. تختلف طريقة ضبط هذه المتغيرات بحسب أسلوب النشر المُتّبع:- Helm
- Docker
عدِّل الإدخالات ذات الصلة ضمن
extraEnvs في ملف values.yaml، ثم حدِّث الإصدار:توسيع تهيئة الـ مُجمِّع
- أنشئ ملف تهيئة مخصصًا يتضمن التهيئة الإضافية
- ركّب الملف في
/etc/otelcol-contrib/custom.config.yaml - عيّن متغير البيئة
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
لا تُعرِّف في التهيئة المخصّصة سوى
receivers وprocessors وpipelines الجديدة. أمّا processors الأساسية (memory_limiter وbatch) وexporters (clickhouse) فهي معرّفة مسبقًا، لذا اكتفِ بالإشارة إليها بالاسم. تُدمَج التهيئة المخصّصة مع التهيئة الأساسية، ولا يمكنها تجاوز المكوّنات الموجودة.هيكل التهيئة
receivers، وoperators، وprocessors، نوصي بالرجوع إلى الوثائق الرسمية لـ OpenTelemetry مُجمِّع.Docker Compose
باستخدام Docker Compose، عدِّل إعداد الـ collector باستخدام متغيرات البيئة ذاتها المذكورة أعلاه:تأمين المجمِّع
- ClickStack المُدار
- ClickStack مفتوح المصدر
افتراضيًا، لا يكون جامع OpenTelemetry الخاص بـ ClickStack مؤمّنًا عند نشره خارج التوزيعات مفتوحة المصدر، ولا يتطلب مصادقة على منافذ OTLP الخاصة به.لتأمين إدخال البيانات، حدِّد رمز مصادقة عند نشر الجامع باستخدام متغير البيئة نوصي أيضًا بما يلي:يفترض هذا أن الـ collector مُعدّ لاستخدام قاعدة البيانات
OTLP_AUTH_TOKEN. وتعتمد طريقة ضبط ذلك على أسلوب النشر الذي تستخدمه:- Helm
- Docker
أضف بالنسبة إلى عمليات النشر في بيئة production، نوصي بتخزين
OTLP_AUTH_TOKEN إلى extraEnvs في ملف values.yaml، ثم قم بترقية الإصدار:OTLP_AUTH_TOKEN وCLICKHOUSE_PASSWORD في Kubernetes secret والإشارة إليهما عبر extraEnvsFrom.- تهيئة الجامع للتواصل مع ClickHouse عبر HTTPS.
- إنشاء مستخدم مخصص لإدخال البيانات بصلاحيات محدودة — انظر أدناه.
- تمكين TLS لنقطة نهاية OTLP، بما يضمن اتصالًا مشفرًا بين SDKs/agents والجامع. ويمكن تهيئة ذلك عبر تهيئة مخصصة للجامع.
إنشاء مستخدم لإدخال البيانات
نوصي بإنشاء قاعدة بيانات ومستخدم مخصصين لجامع OTel لإدخال البيانات إلى Managed ClickStack. ويجب أن يمتلك هذا المستخدم صلاحية إنشاء الجداول التي ينشئها ClickStack ويستخدمها وإدخال البيانات فيها.otel. يمكن التحكم في ذلك عبر متغير البيئة HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE. مرّر هذا إلى الـ collector على غرار متغيرات البيئة الأخرى.المعالجة - التصفية، والتحويل، والإثراء
- نشر نسختهم الخاصة من OTel collector لتنفيذ التصفية والمعالجة، ثم إرسال الأحداث إلى ClickStack collector عبر OTLP لإدخالها إلى ClickHouse.
- نشر نسختهم الخاصة من OTel collector وإرسال الأحداث مباشرةً إلى ClickHouse باستخدام ClickHouse exporter.
-
Processors - تأخذ Processors البيانات التي تجمعها receivers وتعدّلها أو تحوّلها قبل إرسالها إلى exporters. وتُطبَّق Processors بالترتيب المحدد في قسم
processorsضمن إعدادات collector. وهي اختيارية، لكن يُوصى عادةً باستخدام الحد الأدنى منها. عند استخدام OTel collector مع ClickHouse، نوصي بقصر Processors على ما يلي: - استخدام memory_limiter لمنع حالات نفاد الذاكرة في collector. راجع تقدير الموارد للاطلاع على التوصيات.
- أي processor ينفّذ إثراءً استنادًا إلى السياق. على سبيل المثال، يتيح Kubernetes Attributes Processor الضبط التلقائي لـ resource attributes الخاصة بـ spans وmetrics وlogs باستخدام metadata الخاصة بـ k8s، مثل إثراء الأحداث بمعرّف pod المصدر.
- Tail أو head sampling عند الحاجة إلى traces.
- Basic filtering - إسقاط الأحداث غير المطلوبة إذا تعذر تنفيذ ذلك عبر operator (انظر أدناه).
- Batching - وهو أمر أساسي عند العمل مع ClickHouse لضمان إرسال البيانات على دفعات. راجع “Optimizing inserts”.
- Operators - توفّر Operators أبسط وحدة معالجة متاحة على مستوى receiver. ويجري دعم parsing الأساسي، مما يسمح بضبط حقول مثل Severity وTimestamp. كما يجري دعم parsing باستخدام JSON وregex هنا، إلى جانب تصفية الأحداث والتحويلات الأساسية. ونوصي بتنفيذ تصفية الأحداث هنا.
مثال
regex_parser) وتصفية الأحداث، إلى جانب معالج لتجميع الأحداث على دفعات والحد من استخدام الذاكرة.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
تحسين عمليات الإدراج
التجميع على دفعات
- (1) إذا واجهت العقدة التي تستقبل البيانات مشكلات، فستنتهي مهلة insert query (أو ستظهر error أكثر تحديدًا) ولن يصل أي إقرار.
- (2) إذا كانت العقدة قد كتبت البيانات، ولكن تعذّر إعادة الإقرار إلى مُرسل query بسبب انقطاع الشبكة، فسيحصل المُرسل إما على timeout أو على error في الشبكة.
timeout الخاص بـ batch processor، مما يضمن بقاء latency من طرف إلى طرف في pipeline منخفضًا، وأن تكون الدفعات ذات حجم متسق.
استخدم عمليات الإدراج غير المتزامنة
timeout الخاصة بـ batch processor. وقد يسبب ذلك مشكلات، وهنا تصبح عمليات الإدراج غير المتزامنة ضرورية. ونادرًا ما تظهر هذه المشكلة إذا كنت ترسل البيانات إلى ClickStack collector الذي يعمل كبوابة Gateway، إذ يخفف هذا الإشكال من خلال عمله كمجمّع — راجع أدوار المجمّع.
إذا تعذر ضمان دفعات كبيرة، يمكنك إسناد التجميع إلى ClickHouse باستخدام عمليات الإدراج غير المتزامنة. ففي عمليات الإدراج غير المتزامنة، تُدرج البيانات أولًا في مخزن مؤقت، ثم تُكتب لاحقًا إلى تخزين قاعدة البيانات بشكل غير متزامن.
عند تمكين عمليات الإدراج غير المتزامنة، عندما يستقبل ClickHouse ① insert query، تُكتب بيانات الاستعلام ② فورًا إلى مخزن مؤقت داخل الذاكرة. وعندما يحدث ③ التفريغ التالي للمخزن المؤقت، تُرتَّب بياناته sorted وتُكتب كجزء إلى تخزين قاعدة البيانات. لاحظ أن البيانات لا تكون قابلة للبحث عبر الاستعلامات قبل تفريغها إلى تخزين قاعدة البيانات؛ كما أن تفريغ المخزن المؤقت قابل للتهيئة.
لتمكين عمليات الإدراج غير المتزامنة للمجمّع، أضف async_insert=1 إلى connection string. ونوصي باستخدام wait_for_async_insert=1 (وهو الإعداد الافتراضي) للحصول على ضمانات التسليم — راجع هنا لمزيد من التفاصيل.
تُدرج البيانات من async insert بمجرد تفريغ المخزن المؤقت في ClickHouse. ويحدث ذلك إما بعد تجاوز async_insert_max_data_size أو بعد مرور async_insert_busy_timeout_ms Milliseconds منذ أول INSERT query. وإذا ضُبط async_insert_stale_timeout_ms على قيمة غير صفرية، فستُدرج البيانات بعد async_insert_stale_timeout_ms milliseconds منذ آخر query. يمكنك ضبط هذه الإعدادات للتحكم في زمن الوصول من طرف إلى طرف في pipeline لديك. وتجد هنا إعدادات إضافية يمكن استخدامها لضبط تفريغ المخزن المؤقت. وبوجه عام، تكون القيم الافتراضية مناسبة.
ضع في اعتبارك عمليات الإدراج غير المتزامنة التكيفيةفي الحالات التي يُستخدم فيها عدد قليل من agent، مع معدل نقل منخفض ولكن متطلبات صارمة لزمن الوصول من طرف إلى طرف، قد تكون عمليات الإدراج غير المتزامنة التكيفية مفيدة. لكن عمومًا، لا تكون مناسبة لحالات استخدام Observability ذات معدل النقل المرتفع، كما هو الحال مع ClickHouse.
async_insert_deduplicate.
يمكن العثور على التفاصيل الكاملة حول تهيئة هذه الميزة في صفحة التوثيق، أو في منشور المدونة المتعمق.
التوسّع
إضافة Kafka
تهيئة OTel collectorيمكن تهيئة توزيعة ClickStack OpenTelemetry collector مع Kafka باستخدام تهيئة collector مخصّصة.
تقدير الموارد
| معدل السجلات | الموارد المخصصة لـ collector agent |
|---|---|
| 1k/second | 0.2CPU, 0.2GiB |
| 5k/second | 0.5 CPU, 0.5GiB |
| 10k/second | 1 CPU, 1GiB |
اختيار المخطط: Map مقابل JSON
Map(LowCardinality(String), String) افتراضيًا. وهذا هو المخطط الموصى به لأعباء عمل observability. كما يتوفر مخطط من النوع JSON بحالة Beta للتقييم في أعباء العمل التي تحتوي على مجموعة صغيرة ومستقرة من مفاتيح السمات.
للاطّلاع على المقارنة الكاملة، ومعرفة متى يكون كلٌّ منهما مناسبًا، ومتغيرات البيئة المطلوبة لتمكين المخطط من النوع JSON، ودليل الترحيل، راجع Map vs JSON type.