К основному содержанию
скилл

azure-eventhub-ts — скилл для Claude Code: что делает и как установить

Скилл обучает ИИ-агента писать код для потоковой обработки данных через Azure Event Hubs на TypeScript. Пригодится при настройке приёма телеметрии IoT и аналитики в реальном времени.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add microsoft/skills --skill azure-eventhub-ts -a claude-code
Открыть на GitHub

Что делает azure-eventhub-ts

Скилл содержит шаблоны работы с библиотекой @azure/event-hubs и аутентификацией через @azure/identity. Ассистент учится создавать клиентов EventHubProducerClient и EventHubConsumerClient, формировать пакеты событий через createBatch(), а также настраивать маршрутизацию по ключам или номерам разделов.

Для надёжности описано сохранение контрольных точек через @azure/eventhubs-checkpointstore-blob и @azure/storage-blob. Без внешнего хранилища контрольных точек консьюмер начнёт перечитывать поток заново при каждом перезапуске сервиса. Инструкция требует задавать переменную AZURE_TOKEN_CREDENTIALS при развёртывании в продакшене с DefaultAzureCredential.

Какие задачи решает

  • настроить пакетную отправку событий в Event Hubs с привязкой к разделам
  • организовать чтение сообщений с сохранением контрольных точек в Blob Storage
  • сконфигурировать аутентификацию через DefaultAzureCredential и Managed Identity
  • задать начальную позицию чтения очереди по смещению или времени

Примеры запросов агенту

  • Напиши TypeScript-сервис для отправки пакетов телеметрии в Event Hub с ключом партиционирования по deviceId
  • Настрой чтение событий через EventHubConsumerClient с сохранением контрольных точек в Azure Blob Storage
  • Сделай подписку на Event Hubs, которая начинает читать сообщения строго с начала очереди @earliest

Как установить azure-eventhub-ts

1Через Skills CLI (Vercel)

npx skills add microsoft/skills --skill azure-eventhub-ts -a claude-code

2Вручную: положить файлы

~/.claude/skills/azure-eventhub-ts/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/azure-eventhub-ts/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о azure-eventhub-ts

Как установить azure-eventhub-ts в Claude Code?

Выполните в терминале команду npx skills add microsoft/skills --skill azure-eventhub-ts -a claude-code. Файл сохранится по пути ~/.claude/skills/azure-eventhub-ts/SKILL.md.

Что делает этот скилл?

Он даёт агенту примеры и правила написания кода на TypeScript для Azure Event Hubs. Сюда входят создание батчей, маршрутизация по партициям, обработка ошибок и приём потоковых данных.

Какие библиотеки нужны для работы с контрольными точками?

Потребуется установить пакеты @azure/eventhubs-checkpointstore-blob и @azure/storage-blob. Они связывают EventHubConsumerClient с контейнером в Azure Blob Storage для сохранения позиции чтения.

Исходный текст

SKILL.md · MIT
---
name: azure-eventhub-ts
description: Build event streaming applications using Azure Event Hubs SDK for JavaScript (@azure/event-hubs). Use when implementing high-throughput event ingestion, real-time analytics, IoT telemetry, or event-driven architectures with partitioned consumers.
license: MIT
metadata:
  author: Microsoft
  version: "1.0.0"
  package: '@azure/event-hubs'
---

# Azure Event Hubs SDK for TypeScript

High-throughput event streaming and real-time data ingestion.

## Installation

```bash
npm install @azure/event-hubs @azure/identity
```

For checkpointing with consumer groups:
```bash
npm install @azure/eventhubs-checkpointstore-blob @azure/storage-blob
```

## Environment Variables

```bash
EVENTHUB_NAMESPACE=<namespace>.servicebus.windows.net
EVENTHUB_NAME=my-eventhub
STORAGE_ACCOUNT_NAME=<storage-account>
STORAGE_CONTAINER_NAME=checkpoints
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```

## Authentication

```typescript
import { EventHubProducerClient, EventHubConsumerClient } from "@azure/event-hubs";
import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity";

const fullyQualifiedNamespace = process.env.EVENTHUB_NAMESPACE!;
const eventHubName = process.env.EVENTHUB_NAME!;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes
// const credential = new ManagedIdentityCredential();

// Producer
const producer = new EventHubProducerClient(fullyQualifiedNamespace, eventHubName, credential);

// Consumer
const consumer = new EventHubConsumerClient(
  "$Default", // Consumer group
  fullyQualifiedNamespace,
  eventHubName,
  credential
);
```

## Core Workflow

### Send Events

```typescript
const producer = new EventHubProducerClient(namespace, eventHubName, credential);

// Create batch and add events
const batch = await producer.createBatch();
batch.tryAdd({ body: { temperature: 72.5, deviceId: "sensor-1" } });
batch.tryAdd({ body: { temperature: 68.2, deviceId: "sensor-2" } });

await producer.sendBatch(batch);
await producer.close();
```

### Send to Specific Partition

```typescript
// By partition ID
const batch = await producer.createBatch({ partitionId: "0" });

// By partition key (consistent hashing)
const batch = await producer.createBatch({ partitionKey: "device-123" });
```

### Receive Events (Simple)

```typescript
const consumer = new EventHubConsumerClient("$Default", namespace, eventHubName, credential);

const subscription = consumer.subscribe({
  processEvents: async (events, context) => {
    for (const event of events) {
      console.log(`Partition: ${context.partitionId}, Body: ${JSON.stringify(event.body)}`);
    }
  },
  processError: async (err, context) => {
    console.error(`Error on partition ${context.partitionId}: ${err.message}`);
  },
});

// Stop after some time
setTimeout(async () => {
  await subscription.close();
  await consumer.close();
}, 60000);
```

### Receive with Checkpointing (Production)

```typescript
import { EventHubConsumerClient } from "@azure/event-hubs";
import { ContainerClient } from "@azure/storage-blob";
import { BlobCheckpointStore } from "@azure/eventhubs-checkpointstore-blob";

const containerClient = new ContainerClient(
  `https://${storageAccount}.blob.core.windows.net/${containerName}`,
  credential
);

const checkpointStore = new BlobCheckpointStore(containerClient);

const consumer = new EventHubConsumerClient(
  "$Default",
  namespace,
  eventHubName,
  credential,
  checkpointStore
);

const subscription = consumer.subscribe({
  processEvents: async (events, context) => {
    for (const event of events) {
      console.log(`Processing: ${JSON.stringify(event.body)}`);
    }
    // Checkpoint after processing batch
    if (events.length > 0) {
      await context.updateCheckpoint(events[events.length - 1]);
    }
  },
  processError: async (err, context) => {
    console.error(`Error: ${err.message}`);
  },
});
```

### Receive from Specific Position

```typescript
const subscription = consumer.subscribe({
  processEvents: async (events, context) => { /* ... */ },
  processError: async (err, context) => { /* ... */ },
}, {
  startPosition: {
    // Start from beginning
    "0": { offset: "@earliest" },
    // Start from end (new events only)
    "1": { offset: "@latest" },
    // Start from specific offset
    "2": { offset: "12345" },
    // Start from specific time
    "3": { enqueuedOn: new Date("2024-01-01") },
  },
});
```

## Event Hub Properties

```typescript
// Get hub info
const hubProperties = await producer.getEventHubProperties();
console.log(`Partitions: ${hubProperties.partitionIds}`);

// Get partition info
const partitionProperties = await producer.getPartitionProperties("0");
console.log(`Last sequence: ${partitionProperties.lastEnqueuedSequenceNumber}`);
```

## Batch Processing Options

```typescript
const subscription = consumer.subscribe(
  {
    processEvents: async (events, context) => { /* ... */ },
    processError: async (err, context) => { /* ... */ },
  },
  {
    maxBatchSize: 100,           // Max events per batch
    maxWaitTimeInSeconds: 30,    // Max wait for batch
  }
);
```

## Key Types

```typescript
import {
  EventHubProducerClient,
  EventHubConsumerClient,
  EventData,
  ReceivedEventData,
  PartitionContext,
  Subscription,
  SubscriptionEventHandlers,
  CreateBatchOptions,
  EventPosition,
} from "@azure/event-hubs";

import { BlobCheckpointStore } from "@azure/eventhubs-checkpointstore-blob";
```

## Event Properties

```typescript
// Send with properties
const batch = await producer.createBatch();
batch.tryAdd({
  body: { data: "payload" },
  properties: {
    eventType: "telemetry",
    deviceId: "sensor-1",
  },
  contentType: "application/json",
  correlationId: "request-123",
});

// Access in receiver
consumer.subscribe({
  processEvents: async (events, context) => {
    for (const event of events) {
      console.log(`Type: ${event.properties?.eventType}`);
      console.log(`Sequence: ${event.sequenceNumber}`);
      console.log(`Enqueued: ${event.enqueuedTimeUtc}`);
      console.log(`Offset: ${event.offset}`);
    }
  },
});
```

## Error Handling

```typescript
consumer.subscribe({
  processEvents: async (events, context) => {
    try {
      for (const event of events) {
        await processEvent(event);
      }
      await context.updateCheckpoint(events[events.length - 1]);
    } catch (error) {
      // Don't checkpoint on error - events will be reprocessed
      console.error("Processing failed:", error);
    }
  },
  processError: async (err, context) => {
    if (err.name === "MessagingError") {
      // Transient error - SDK will retry
      console.warn("Transient error:", err.message);
    } else {
      // Fatal error
      console.error("Fatal error:", err);
    }
  },
});
```

## Best Practices

1. **Use checkpointing** - Always checkpoint in production for exactly-once processing
2. **Batch sends** - Use `createBatch()` for efficient sending
3. **Partition keys** - Use partition keys to ensure ordering for related events
4. **Consumer groups** - Use separate consumer groups for different processing pipelines
5. **Handle errors gracefully** - Don't checkpoint on processing failures
6. **Close clients** - Always close producer/consumer when done
7. **Monitor lag** - Track `lastEnqueuedSequenceNumber` vs processed sequence

© Microsoft · MIT · microsoft/skills

Похожие скиллы

Все скиллы по теме «Облака: AWS, Azure, GCP» →
caveman-manage JuliusBrussee Проверяет состояние и результаты экспериментов Caveman Cloud, предлагает одно действие или блокирует рискованный запрос. Нужен перед запуском, одобрением, отменой или откатом. CX Codex +1 104 200установок workers-best-practices cloudflare Скилл настраивает ИИ на проверку продакшен-кода Cloudflare Workers по актуальным правилам рантайма, типам Wrangler и антипаттернам. CX Codex +1 126 100установок cloudflare-email-service cloudflare Скилл для работы с Cloudflare Email Sending и Email Routing: помогает настроить отправку и приём писем в Workers. CX Codex +1 102 300установок firebase-basics официальный google Скилл настраивает Firebase CLI, помогает войти в аккаунт, создать или выбрать проект и скачать конфигурацию Android или iOS. CX Codex 14 100установок cloudflare-one cloudflare Помогает агенту проектировать, настраивать и разбирать развёртывания Cloudflare One Zero Trust и SASE. Пригодится, когда нужно спланировать Access, Gateway или туннели без похода в документацию вручную. CX Codex +1 93 100установок cloudflare-one-migrations cloudflare Помогает спланировать переход с VPN, SWG или SASE на Cloudflare One: сопоставляет политики, находит пробелы и расписывает порядок выката. CX Codex +1 89 500установок

Из того же набора207

Весь набор →
azure-monitor-opentelemetry-ts Скилл помогает подключить Azure Monitor и OpenTelemetry к Node.js-приложению: настроить трассировки, метрики и логи для Application Insights. 1установок azure-keyvault-secrets-ts Скилл обучает ИИ-агента безопасно сохранять, извлекать и удалять секреты или криптографические ключи в Azure Key Vault через официальные пакеты для TypeScript. 1установок azure-keyvault-keys-ts Скилл помогает писать TypeScript-код для ключей Azure Key Vault: создавать и ротировать ключи, шифровать данные и подписывать их. Пригодится при работе с SDK @azure/keyvault-keys. 1установок azure-identity-ts Скилл подсказывает агенту, как настроить аутентификацию в Azure через библиотеку @azure/identity в TypeScript. Пригодится, когда в проекте появляется DefaultAzureCredential или managed identity. 1установок azure-cosmos-ts Скилл для работы с Azure Cosmos DB через JavaScript/TypeScript SDK: CRUD документов, запросы, массовые операции. Пригодится, когда агент пишет код доступа к данным. 1установок azure-appconfiguration-ts Скилл учит агента работать с Azure App Configuration из TypeScript: настройки, фичефлаги, ссылки на Key Vault и динамическое обновление. 1установок azure-ai-voicelive-ts Помогает создавать голосовых помощников на JavaScript и TypeScript с потоковым обменом аудио через WebSocket. Пригодится при интеграции моделей Azure AI в Node.js или веб-приложения. 1установок azure-ai-translation-ts Скилл помогает подключать Azure Translation SDKs для TypeScript: переводить текст и документы, определять язык и менять письменность. Пригодится при разработке приложений с этими функциями. 1установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой