Set up comprehensive observability for Fireflies.ai integrations with metrics, traces, and alerts. Use when implementing monitoring for Fireflies.ai operations, setting up dashboards, or configuring alerting for Fireflies.ai integration health. Trigger with phrases like "fireflies monitoring", "fireflies metrics", "fireflies observability", "monitor fireflies", "fireflies alerts", "fireflies tracing".
Monitor Fireflies.ai meeting transcription quality, bot join reliability, and transcript processing latency.
set -euo pipefail
# Query recent meetings and check bot join status
curl -X POST https://api.fireflies.ai/graphql \
-H "Authorization: Bearer $FIREFLIES_API_KEY" \
-d '{"query": "{ transcripts(limit: 50) { id title date duration bot_joined processing_status speakers { name } } }"}' | \
jq '.data.transcripts[] | {title, date, bot_joined, status: .processing_status, speakers: (.speakers | length)}'
// fireflies-metrics.ts
async function monitorProcessing() {
const res = await firefliesGQL(`{ transcripts(limit: 20) { id date duration processing_status processed_at } }`);
for (const t of res.data.transcripts) {
if (t.processing_status === 'completed' && t.processed_at) {
const meetingEnd = new Date(t.date).getTime() + t.duration * 60000; # 60000: 1 minute in ms
const processedAt = new Date(t.processed_at).getTime();
const processingMinutes = (processedAt - meetingEnd) / 60000; # 1 minute in ms
emitHistogram('fireflies_processing_time_min', processingMinutes);
}
emitCounter('fireflies_transcripts_total', 1, { status: t.processing_status });
}
}
// Identify seats with low usage to optimize licensing costs
async function seatUtilization() {
const members = await firefliesGQL(`{ teamMembers { id email transcripts_count last_active } }`);
for (const m of members.data.teamMembers) {
emitGauge('fireflies_seat_usage', m.transcripts_count, { user: m.email });
if (m.transcripts_count < 5 && daysSince(m.last_active) > 30) {
console.warn(`Low utilization seat: ${m.email} (${m.transcripts_count} transcripts, inactive ${daysSince(m.last_active)}d)`);
}
}
}