> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> SDK لـ NestJS من أجل ClickStack - مكدس observability من ClickHouse

# NestJS

export const ClickStackIntegrates = ({signals = []}) => {
  const list = Array.isArray(signals) ? signals : String(signals).split(",");
  const supported = list.map(s => String(s).trim().toLowerCase());
  const pillStyle = {
    display: "inline-flex",
    alignItems: "center",
    padding: "0.125rem 0.625rem",
    borderRadius: "9999px",
    fontSize: "0.8125rem",
    fontWeight: 500,
    lineHeight: 1.6,
    color: "#161517",
    backgroundColor: "#faff69",
    border: "1px solid rgba(0, 0, 0, .1)",
    marginRight: "0.5rem"
  };
  return <div style={{
    margin: "0 0 1.25rem"
  }}>
      <span style={{
    marginRight: "0.5rem"
  }}>يتكامل هذا الدليل مع:</span>
      {supported.includes("logs") && <span style={pillStyle}>السجلات</span>}
      {supported.includes("metrics") && <span style={pillStyle}>المقاييس</span>}
      {supported.includes("traces") && <span style={pillStyle}>التتبعات</span>}
    </div>;
};

يتيح لك تكامل NestJS مع ClickStack إنشاء مسجّل أو استخدام
المسجّل الافتراضي لإرسال السجلات إلى ClickStack (بالاعتماد على [nest-winston](https://www.npmjs.com/package/nest-winston?activeTab=readme)).

<ClickStackIntegrates signals={['logs']} />

*لإرسال المقاييس أو APM/التتبعات، ستحتاج أيضًا إلى إضافة
التكامل الخاص باللغة المقابلة إلى تطبيقك.*

<h2 id="getting-started">
  البدء
</h2>

استورد `HyperDXNestLoggerModule` إلى `AppModule` الرئيسي، واستخدم الطريقة `forRoot()`
لتهيئته.

```javascript theme={null}
import { Module } from '@nestjs/common';
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

@Module({
  imports: [
    HyperDXNestLoggerModule.forRoot({
      url: '<YOUR_OTEL_COLLECTOR_HTTP_ENDPOINT>',
      apiKey: '<YOUR_INGESTION_API_KEY>', // Omit for Managed ClickStack
      maxLevel: 'info',
      service: 'my-app',
    }),
  ],
})
export class AppModule {}
```

بعد ذلك، سيصبح مثيل winston متاحًا للحقن على مستوى
المشروع بأكمله باستخدام رمز الحقن `HDX_LOGGER_MODULE_PROVIDER`:

```javascript theme={null}
import { Controller, Inject } from '@nestjs/common';
import { HyperDXNestLoggerModule, HyperDXNestLogger } from '@hyperdx/node-logger';

@Controller('cats')
export class CatsController {
  constructor(
    @Inject(HyperDXNestLoggerModule.HDX_LOGGER_MODULE_PROVIDER)
    private readonly logger: HyperDXNestLogger,
  ) { }

  meow() {
    this.logger.info({ message: '🐱' });
  }
}
```

<h3 id="replacing-the-nest-logger">
  استبدال المسجّل في Nest (أيضًا أثناء التمهيد)
</h3>

<Info>
  **مهم**

  عند القيام بذلك، ستتخلى عن حقن التبعيات، ما يعني أن `forRoot` و`forRootAsync` لن يعودا مطلوبين ولا ينبغي استخدامهما. أزِلهما من الوحدة الرئيسية.
</Info>

لاستخدام حقن التبعيات عيبٌ بسيط. إذ يتعين على Nest أولًا تمهيد
التطبيق (إنشاء مثيلات الوحدات والموفّرات، وحقن التبعيات،
وما إلى ذلك)، وخلال هذه العملية لا يكون مثيل `HyperDXNestLogger` متاحًا
بعد، ما يعني أن Nest يعود إلى المسجّل الداخلي.

أحد الحلول هو إنشاء المسجّل خارج دورة حياة التطبيق، باستخدام
الدالة `createLogger`، ثم تمريره إلى `NestFactory.create`. عندها سيقوم Nest
بتغليف المسجّل المخصص لدينا (وهو نفس المثيل الذي تعيده الدالة `createLogger`)
داخل الفئة Logger، مع إعادة توجيه جميع الاستدعاءات إليه:

أنشئ المسجّل في ملف `main.ts`

```javascript theme={null}
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: HyperDXNestLoggerModule.createLogger({
      url: '<YOUR_OTEL_COLLECTOR_HTTP_ENDPOINT>',
      apiKey: '<YOUR_INGESTION_API_KEY>', // Omit for Managed ClickStack
      maxLevel: 'info',
      service: 'my-app',
    })
  });
  await app.listen(3000);
}
bootstrap();
```

غيّر وحدتك الرئيسية بحيث توفّر خدمة Logger:

```javascript theme={null}
import { Logger, Module } from '@nestjs/common';

@Module({
  providers: [Logger],
})
export class AppModule {}
```

ثم احقن المسجّل ببساطة عبر تلميح النوع باستخدام Logger من `@nestjs/common`:

```javascript theme={null}
import { Controller, Logger } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  constructor(private readonly logger: Logger) {}

  meow() {
    this.logger.log({ message: '🐱' });
  }
}
```
