From Black Box to Clear Visibility: Building a CloudWatch Dashboard for Jitsi Meet

AWS cloudwatch monitoring jitsi infrastructure-as-code cdk typescript opensource video-conferencing certible

From Black Box to Clear Visibility: Building a CloudWatch Dashboard for Jitsi Meet

At Certible, we conduct certification exams worldwide, and reliable video conferencing is mission-critical. When participants join an exam session, everything needs to work flawlessly.

We chose Jitsi Meet as our open-source video conferencing solution, but like many self-hosted services, it started as somewhat of a black box. When issues arose, we were flying blind, scrambling through logs trying to understand what went wrong.

That’s when we decided to build comprehensive monitoring – and eventually contributed it back to the community as @certible/jitsi-aws-cdk.

The Challenge: Monitoring a Complex Video System

Jitsi Meet isn’t just one service – it’s an ecosystem:

Each component generates different types of logs, has unique failure modes, and affects the user experience in different ways. Without proper monitoring, troubleshooting felt like detective work with missing clues.

Our Solution: Infrastructure as Code Monitoring

Rather than building dashboards manually through the AWS console (which doesn’t scale or version well), we created a CDK construct that programmatically builds CloudWatch dashboards with pre-configured widgets for each Jitsi component.

Here’s how we integrated it into our infrastructure:

import { JitsiCloudWatchDashboard } from '@certible/jitsi-aws-cdk';

export class ConferenceStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);
    
    // Create the dashboard
    const jitsiDashboard = new JitsiCloudWatchDashboard(this, 'ExamDashboard', {
      dashboardId: 'certible-jitsi-monitoring',
    });

    // Add monitoring for each service
    const logGroupName = '/aws/ecs/jitsi-meet';
    jitsiDashboard.addWeb(logGroupName);      // Frontend monitoring
    jitsiDashboard.addJicofo(logGroupName);   // Conference management
    jitsiDashboard.addJibri(logGroupName);    // Recording service
    jitsiDashboard.addJvb(logGroupName);      // Video bridge
  }
}

Getting Logs from Docker to CloudWatch

The key was configuring our Jitsi services to send logs to CloudWatch using the AWS logs driver. Here’s our docker-compose configuration:

services:
  web:
    image: jitsi/web:latest
    logging:
      driver: awslogs
      options:
        awslogs-group: ${AWSLOGS_GROUP}
        awslogs-region: eu-central-1
        tag: '{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.ID}}'

This setup automatically forwards all container logs to CloudWatch with consistent naming patterns, making them easy to query and visualize.

What We Can See Now

Our dashboard provides instant visibility into:

Why We Open-Sourced It

Jitsi is an amazing open-source project, but monitoring shouldn’t be an afterthought. We realized other organizations running Jitsi on AWS could benefit from our approach.

The construct handles the complexity of:

Flexible Implementation

You don’t have to use our full construct – individual widget functions are available as standalone utilities:

import { jitsiWidgetsJibri } from '@certible/jitsi-aws-cdk';
import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';

const myDashboard = new Dashboard(this, 'CustomDashboard');
jitsiWidgetsJibri(myDashboard, '/aws/ecs/jitsi-meet');

This flexibility means you can integrate Jitsi monitoring into existing dashboards or customize the widgets for your specific needs.

The Bigger Picture

Good monitoring transforms operations from reactive firefighting to proactive service management. When your video conferencing affects real people’s careers (like certification exams), visibility isn’t optional.

By packaging our monitoring approach as reusable infrastructure code, we’re helping other teams avoid the same blind spots we experienced.