@azure/mcp-win32-x64
Version:
Azure MCP Server - Model Context Protocol implementation for Azure, for win32 on x64
199 lines (145 loc) • 5.61 kB
Markdown
# Basic Azure Monitor Setup for Node.js with Redis
This guide shows how to add Azure Monitor OpenTelemetry to a Node.js application using Redis.
## Prerequisites
- Node.js 14.x or higher
- npm or yarn
- Node.js application with Redis (`redis` or `ioredis` package)
- Azure Application Insights resource
## Step 1: Install Package
```bash
npm install @azure/monitor-opentelemetry
```
## Step 2: Initialize at Startup
Create or update your main entry point (typically `index.js` or `server.js`):
```javascript
// IMPORTANT: This must be the first line, before any other imports
const { useAzureMonitor } = require('@azure/monitor-opentelemetry');
// Initialize Azure Monitor - Redis operations will be automatically instrumented
useAzureMonitor({
azureMonitorExporterOptions: {
connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING
}
});
// Now load your application code
const express = require('express');
const { createClient } = require('redis');
const app = express();
const port = process.env.PORT || 3000;
// Redis client
const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
const redisClient = createClient({ url: redisUrl });
async function connectToRedis() {
redisClient.on('error', err => console.error('Redis Client Error:', err));
await redisClient.connect();
console.log('Connected to Redis');
}
app.use(express.json());
app.get('/api/cache/:key', async (req, res) => {
// This operation will be automatically tracked as a dependency
const value = await redisClient.get(req.params.key);
if (value === null) {
return res.status(404).json({ error: 'Key not found' });
}
res.json({ key: req.params.key, value: JSON.parse(value) });
});
app.post('/api/cache', async (req, res) => {
const { key, value, ttl } = req.body;
const options = ttl ? { EX: ttl } : {};
await redisClient.set(key, JSON.stringify(value), options);
res.status(201).json({ key, value });
});
connectToRedis().then(() => {
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
});
```
## Step 3: Configure Connection String
Create a `.env` file in your project root:
```env
APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://...
REDIS_URL=redis://localhost:6379
PORT=3000
```
Install `dotenv` to load environment variables:
```bash
npm install dotenv
```
Load it at the very top of your entry file:
```javascript
require('dotenv').config();
const { useAzureMonitor } = require('@azure/monitor-opentelemetry');
// ... rest of code
```
## What Gets Instrumented Automatically
With Azure Monitor OpenTelemetry, the following Redis operations are automatically tracked:
- **Commands**: GET, SET, DEL, HGET, HSET, LPUSH, etc.
- **Command duration**: Time taken for each operation
- **Database index**: Which Redis database was used
- **Success/failure**: Operation status
## Using with ioredis
If you're using `ioredis`, the setup is the same:
```javascript
require('dotenv').config();
const { useAzureMonitor } = require('@azure/monitor-opentelemetry');
useAzureMonitor({
azureMonitorExporterOptions: {
connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING
}
});
const Redis = require('ioredis');
const express = require('express');
const redis = new Redis(process.env.REDIS_URL);
const app = express();
app.get('/api/cache/:key', async (req, res) => {
const value = await redis.get(req.params.key);
res.json({ key: req.params.key, value });
});
```
## Step 4: Add Custom Telemetry (Optional)
```javascript
const { trace } = require('@opentelemetry/api');
app.post('/api/session', async (req, res) => {
const tracer = trace.getTracer('my-app');
await tracer.startActiveSpan('create-session', async (span) => {
try {
const sessionId = `session:${Date.now()}`;
span.setAttribute('session.id', sessionId);
await redisClient.set(sessionId, JSON.stringify(req.body), { EX: 3600 });
res.status(201).json({ sessionId });
} catch (error) {
span.recordException(error);
span.setStatus({ code: 2, message: error.message });
res.status(500).json({ error: 'Cache error' });
} finally {
span.end();
}
});
});
```
## Using with Azure Cache for Redis
For Azure Cache for Redis, update your connection string:
```env
REDIS_URL=rediss://:YOUR_ACCESS_KEY@YOUR_REDIS_NAME.redis.cache.windows.net:6380
```
Note the `rediss://` protocol for SSL connections (required by Azure Cache for Redis).
## Viewing Telemetry in Azure Portal
1. Open your Application Insights resource in Azure Portal
2. Navigate to "Application Map" to see Redis as a dependency
3. Use "Transaction search" to find specific cache operations
4. Check "Dependencies" under "Investigate" to see operation performance
## Troubleshooting
### Redis operations not appearing
1. Ensure `useAzureMonitor()` is called **before** importing `redis` or `ioredis`
2. Verify the connection string is set correctly
3. Check that operations are being executed (not just connections)
### High volume of telemetry
Redis is often used for high-frequency operations. Consider sampling:
```javascript
useAzureMonitor({
azureMonitorExporterOptions: {
connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING
},
samplingRatio: 0.1 // Sample 10% of requests
});
```