google-cloud-mcp
Version:
Model Context Protocol server for Google Cloud services
112 lines (98 loc) • 3.01 kB
text/typescript
/**
* Type definitions for Google Cloud Monitoring service
*/
import monitoring from '@google-cloud/monitoring';
const { MetricServiceClient } = monitoring;
/**
* Interface for Google Cloud Monitoring time series data
*/
export interface TimeSeriesData {
metric: {
type: string;
labels?: Record<string, string>;
};
resource: {
type: string;
labels: Record<string, string>;
};
metricKind: string;
valueType: string;
points: Array<{
interval: {
startTime: string;
endTime: string;
};
value: {
boolValue?: boolean;
int64Value?: string;
doubleValue?: number;
stringValue?: string;
distributionValue?: any;
};
}>;
}
/**
* Initialises the Google Cloud Monitoring client
*
* @returns A configured Monitoring client
*/
export function getMonitoringClient(): any {
return new MetricServiceClient({
projectId: process.env.GOOGLE_CLOUD_PROJECT
});
}
/**
* Formats a time series data point for display
*
* @param timeSeries The time series data to format
* @returns A formatted string representation of the time series data
*/
export function formatTimeSeriesData(timeSeries: TimeSeriesData[]): string {
if (!timeSeries || timeSeries.length === 0) {
return 'No time series data found.';
}
let result = '';
for (const series of timeSeries) {
// Format metric information
const metricType = series.metric.type;
const metricLabels = series.metric.labels
? Object.entries(series.metric.labels)
.map(([k, v]) => `${k}=${v}`)
.join(', ')
: '';
const resourceType = series.resource.type;
const resourceLabels = Object.entries(series.resource.labels)
.map(([k, v]) => `${k}=${v}`)
.join(', ');
result += `## Metric: ${metricType}\n`;
result += `- Resource: ${resourceType}(${resourceLabels})\n`;
if (metricLabels) {
result += `- Labels: ${metricLabels}\n`;
}
result += `- Kind: ${series.metricKind}, Type: ${series.valueType}\n\n`;
// Format data points
result += '| Timestamp | Value |\n';
result += '|-----------|-------|\n';
for (const point of series.points) {
const timestamp = new Date(point.interval.endTime).toISOString();
// Extract the value based on valueType
let value: string;
if (point.value.boolValue !== undefined) {
value = String(point.value.boolValue);
} else if (point.value.int64Value !== undefined) {
value = point.value.int64Value;
} else if (point.value.doubleValue !== undefined) {
value = point.value.doubleValue.toFixed(6);
} else if (point.value.stringValue !== undefined) {
value = point.value.stringValue;
} else if (point.value.distributionValue) {
value = 'Distribution';
} else {
value = 'N/A';
}
result += `| ${timestamp} | ${value} |\n`;
}
result += '\n---\n\n';
}
return result;
}