meshed-monitor-sdk
Version:
JavaScript/Node.js SDK for MeshedMonitor with real-time logging and advanced features
372 lines (283 loc) • 8.85 kB
Markdown
# MeshedMonitor JavaScript SDK
The official JavaScript/Node.js SDK for MeshedMonitor with real-time logging, batch processing, and advanced monitoring features.
## Features
- 🚀 **Real-time logging** with WebSocket streaming
- 📦 **Batch processing** for high-performance logging
- 🔄 **Background sync** with offline support
- 🎯 **Performance tracking** with transactions and spans
- 🏷️ **Rich metadata** and tagging support
- 🔒 **Automatic retries** with exponential backoff
- 🌐 **Universal compatibility** (Browser and Node.js)
- 📊 **Request correlation** and distributed tracing
- 🛡️ **Error tracking** with stack traces
- 🔧 **Express.js middleware** included
## Installation
```bash
npm install @meshed-monitor/sdk-js
```
## Quick Start
### Basic Setup
```javascript
import MeshedMonitor from '@meshed-monitor/sdk-js';
const monitor = new MeshedMonitor({
apiKey: 'your-api-key',
projectId: 'your-project-id',
environment: 'production',
debug: false
});
// Basic logging
monitor.info('Application started');
monitor.warn('This is a warning', { component: 'auth' });
monitor.error('Something went wrong', { userId: '123' });
```
### Express.js Integration
```javascript
import express from 'express';
import MeshedMonitor from '@meshed-monitor/sdk-js';
const app = express();
const monitor = new MeshedMonitor({
apiKey: process.env.MESHED_MONITOR_API_KEY,
projectId: 'my-api',
environment: process.env.NODE_ENV
});
// Add middleware for automatic request logging
app.use(monitor.expressMiddleware());
app.get('/api/users', (req, res) => {
// Access monitor through req.meshedMonitor
req.meshedMonitor.log('Fetching users', 'INFO');
try {
const users = getUsersFromDatabase();
res.json(users);
} catch (error) {
req.meshedMonitor.log('Failed to fetch users', 'ERROR', {
error: error.message
});
res.status(500).json({ error: 'Internal server error' });
}
});
```
## Configuration Options
```javascript
const monitor = new MeshedMonitor({
apiKey: 'your-api-key', // Required: Your MeshedMonitor API key
projectId: 'your-project-id', // Required: Project identifier
apiUrl: 'https://api.example.com', // Optional: Custom API endpoint
environment: 'production', // Optional: Environment (production, staging, etc.)
debug: false, // Optional: Enable debug logging
batchSize: 50, // Optional: Number of logs per batch
batchTimeout: 5000, // Optional: Max time to wait before sending batch (ms)
maxRetries: 3, // Optional: Number of retry attempts
retryDelay: 1000, // Optional: Initial retry delay (ms)
enableBackgroundSync: true // Optional: Enable offline queue
});
```
## API Reference
### Logging Methods
```javascript
// Basic logging with levels
monitor.debug('Debug message');
monitor.info('Info message');
monitor.warn('Warning message');
monitor.error('Error message');
// Advanced logging with metadata
monitor.info('User logged in', {
userId: '123',
email: 'user@example.com',
source: 'auth-service',
tags: { feature: 'login', version: '1.2.0' }
});
```
### Error Tracking
```javascript
try {
throwError();
} catch (error) {
// Automatic error capture with stack trace
monitor.captureError(error, {
userId: '123',
operation: 'database-query',
query: 'SELECT * FROM users'
});
}
```
### Performance Monitoring
```javascript
// Track transactions and spans
const transaction = monitor.startTransaction('user-registration');
try {
// Start a span for database operation
const dbSpan = transaction.startSpan('database-insert');
await createUserInDatabase(userData);
dbSpan.finish();
// Start a span for email sending
const emailSpan = transaction.startSpan('send-welcome-email');
await sendWelcomeEmail(userData.email);
emailSpan.finish();
} finally {
transaction.finish(); // This logs the total transaction time
}
```
### Context Management
```javascript
// Set user context
monitor.setUser({
id: '123',
email: 'user@example.com',
name: 'John Doe'
});
// Set global tags
monitor.setTags({
version: '1.2.0',
feature: 'premium'
});
// Set release version
monitor.setRelease('v1.2.0');
// Set request correlation IDs
monitor.setRequestContext('req-123', 'trace-456');
```
### Function Wrapping
```javascript
// Automatically monitor any async function
const monitoredFunction = monitor.wrap(async (userId) => {
const user = await database.getUser(userId);
return user;
}, 'getUserById');
// Usage - automatically logs performance and errors
const user = await monitoredFunction('123');
```
## Batch Processing
The SDK automatically batches logs for optimal performance:
```javascript
// These logs will be batched together
for (let i = 0; i < 100; i++) {
monitor.info(`Processing item ${i}`);
}
// Force flush the current batch
await monitor.flush();
```
## Real-time Streaming
Logs are automatically streamed to your MeshedMonitor dashboard in real-time when using the new streaming endpoints:
```javascript
// All logs automatically stream to connected dashboard clients
monitor.info('This appears in real-time on your dashboard');
```
## Advanced Features
### Background Sync
The SDK queues logs when offline and syncs them when connectivity is restored:
```javascript
// Even if the network is down, logs are queued
monitor.info('This will be sent when network is available');
```
### Request Correlation
Trace requests across multiple services:
```javascript
// In your API gateway
app.use((req, res, next) => {
const traceId = req.headers['x-trace-id'] || generateTraceId();
monitor.setRequestContext(generateRequestId(), traceId);
next();
});
// In your microservice
monitor.info('Processing payment', {
// traceId is automatically included
amount: 100,
currency: 'USD'
});
```
### Health Checks
```javascript
// Check SDK connectivity
const isHealthy = await monitor.healthCheck();
if (!isHealthy) {
console.warn('MeshedMonitor is not reachable');
}
```
## Environment Variables
You can configure the SDK using environment variables:
```bash
MESHED_MONITOR_API_KEY=your-api-key
MESHED_MONITOR_API_URL=https://your-instance.com/api
NODE_ENV=production
```
## Best Practices
### 1. Use Appropriate Log Levels
```javascript
monitor.debug('Detailed debugging info'); // Development only
monitor.info('General information'); // Normal operations
monitor.warn('Something unusual happened'); // Potential issues
monitor.error('Something failed'); // Errors that need attention
```
### 2. Add Meaningful Context
```javascript
monitor.info('Payment processed', {
userId: '123',
amount: 99.99,
currency: 'USD',
paymentMethod: 'stripe',
tags: { feature: 'checkout' }
});
```
### 3. Use Transactions for Performance Tracking
```javascript
const transaction = monitor.startTransaction('checkout-flow');
// Track each step
const validateSpan = transaction.startSpan('validate-cart');
await validateCart();
validateSpan.finish();
const paymentSpan = transaction.startSpan('process-payment');
await processPayment();
paymentSpan.finish();
transaction.finish(); // Logs total checkout time
```
### 4. Handle Cleanup Properly
```javascript
// In your application shutdown
process.on('SIGTERM', async () => {
await monitor.flush(); // Send any remaining logs
monitor.destroy(); // Clean up resources
process.exit(0);
});
```
## Browser Support
The SDK works in modern browsers with fetch support:
```html
<script type="module">
import MeshedMonitor from './node_modules/@meshed-monitor/sdk-js/index.js';
const monitor = new MeshedMonitor({
apiKey: 'your-api-key',
projectId: 'frontend-app',
environment: 'production'
});
monitor.info('Page loaded');
window.addEventListener('error', (event) => {
monitor.captureError(event.error);
});
</script>
```
## Migration from v0.x
If you're upgrading from an older version:
```javascript
// Old way
monitor.captureMessage('Hello', 'info');
// New way
monitor.info('Hello');
```
## Troubleshooting
### Common Issues
1. **Logs not appearing**: Check your API key and network connectivity
2. **High memory usage**: Reduce batchSize or batchTimeout
3. **Performance impact**: Enable batch processing and background sync
### Debug Mode
Enable debug logging to troubleshoot:
```javascript
const monitor = new MeshedMonitor({
apiKey: 'your-api-key',
debug: true // This will log SDK activity to console
});
```
## License
MIT
## Support
- Documentation: [https://docs.meshedmonitor.com](https://docs.meshedmonitor.com)
- Issues: [GitHub Issues](https://github.com/meshed-cloud/meshed-monitor/issues)
- Community: [Discord](https://discord.gg/meshedmonitor)