Skip to content

Repository files navigation

Telemetry 2.0

License C Platform

A lightweight, efficient telemetry framework for RDK (Reference Design Kit) embedded devices.

Overview

Telemetry 2.0 provides real-time monitoring, event collection, and reporting capabilities optimized for resource-constrained embedded devices such as set-top boxes, gateways, and IoT devices.

Key Features

  • Efficient: Connection pooling and batch reporting
  • 🔒 Secure: mTLS support for encrypted communication
  • 📊 Flexible: Profile-based configuration (JSON/XConf)
  • 🔧 Platform-Independent: Multiple architecture support

Architecture Highlights

graph TB
    A[Telemetry Events/Markers] --> B[Profile Matcher]
    B --> C[Report Generator]
    C --> D[HTTP Connection Pool]
    D --> E[XConf Server / Data Collector]
    F[XConf Client] -.->|Config| B
    G[Scheduler] -.->|Triggers| C
Loading

Quick Start

Prerequisites

  • GCC 4.8+ or Clang 3.5+
  • pthread library
  • libcurl 7.65.0+
  • cJSON library
  • OpenSSL 1.1.1+ (for mTLS)

Build

# Clone repository
git clone https://github.com/rdkcentral/telemetry.git
cd telemetry

# Configure
autoreconf -i
./configure 

# Build
make

# Install
sudo make install

Docker Development

Refer to the provided Docker container for a consistent development environment:

https://github.com/rdkcentral/docker-device-mgt-service-test

See Build Setup Guide for detailed build options.

Basic Usage

#include "telemetry2_0.h"

int main(void) {
    // Initialize telemetry
    if (t2_init() != 0) {
        fprintf(stderr, "Failed to initialize telemetry\n");
        return -1;
    }
    
    // Send a marker event
    t2_event_s("SYS_INFO_DeviceBootup", "Device started successfully");
    
    // Cleanup
    t2_uninit();
    return 0;
}

Compile: gcc -o myapp myapp.c -ltelemetry

Documentation

📚 Complete Documentation

Key Documents

Component Documentation

Individual component documentation is in source/docs/:

Project Structure

telemetry/
├── source/              # Source code
│   ├── bulkdata/       # Profile and marker management
│   ├── protocol/       # HTTP/RBUS communication
│   ├── scheduler/      # Report scheduling
│   ├── xconf-client/   # Configuration retrieval
│   ├── dcautil/        # Log marker utilities
│   └── test/           # Unit tests (gtest/gmock)
├── include/            # Public headers
├── config/             # Configuration files
├── docs/               # Documentation
├── containers/         # Docker development environment
└── test/               # Functional tests

Configuration

Profile Configuration

Telemetry uses JSON profiles to define what data to collect:

{
  "Profile": "RDKB_BasicProfile",
  "Version": "1.0.0",
  "Protocol": "HTTP",
  "EncodingType": "JSON",
  "ReportingInterval": 300,
  "Parameters": [
    {
      "type": "dataModel",
      "name": "Device.DeviceInfo.Manufacturer"
    },
    {
      "type": "event",
      "eventName": "bootup_complete"
    }
  ]
}

See Profile Configuration Guide for details.

Environment Variables

Variable Description Default
T2_ENABLE_DEBUG Enable debug logging 0
T2_PROFILE_PATH Default profile directory /etc/DefaultT2Profile.json
T2_XCONF_URL XConf server URL -
T2_REPORT_URL Report upload URL -

Runtime Operations

Signal Handling

The Telemetry 2.0 daemon responds to the following signals for runtime control:

Signal Value Purpose
SIGTERM 15 Gracefully terminate the daemon, cleanup resources and exit
SIGINT 2 Interrupt signal - uninitialize services, cleanup and exit
SIGUSR1 10 Trigger log upload with seekmap reset
SIGUSR2 12 Reload configuration from XConf server
LOG_UPLOAD 10 Custom signal to trigger log upload and reset retain seekmap flag
EXEC_RELOAD 12 Custom signal to reload XConf configuration and restart XConf client
LOG_UPLOAD_ONDEMAND 29 Custom signal for on-demand log upload without seekmap reset
SIGIO - I/O signal - repurposed for on-demand log upload

Examples:

# Gracefully stop telemetry
kill -SIGTERM $(pidof telemetry2_0)

# Trigger log upload
kill -10 $(pidof telemetry2_0)

# Reload configuration
kill -12 $(pidof telemetry2_0)

# On-demand log upload
kill -29 $(pidof telemetry2_0)

Notes:

  • Custom signal values (10, 12, 29) are defined to avoid conflicts with standard system signals
  • Signals SIGUSR1, SIGUSR2, LOG_UPLOAD, EXEC_RELOAD, LOG_UPLOAD_ONDEMAND, and SIGIO are blocked during signal handler execution to prevent race conditions
  • Child processes ignore most signals except SIGCHLD, SIGPIPE, SIGALRM, and the log upload/reload signals

WebConfig/Profile Reload

Telemetry 2.0 supports multiple mechanisms for dynamically reloading report profiles and configuration:

1. Signal-Based XConf Reload

Trigger XConf configuration reload using signals:

# Using custom signal value
kill -12 $(pidof telemetry2_0)

This stops the XConf client and restarts it to fetch updated configuration from the XConf server.

2. RBUS-Based Profile Updates

For WebConfig integration, profiles can be set directly via RBUS (requires rbuscli):

# Load a temporary profile (JSON format)
rbuscli setv "Device.X_RDKCENTRAL-COM_T2.Temp_ReportProfiles" string '{"profiles":[...]}'

# Set permanent profiles
rbuscli setv "Device.X_RDKCENTRAL-COM_T2.ReportProfiles" string '{"profiles":[...]}'

# Set profiles in MessagePack binary format
rbuscli setv "Device.X_RDKCENTRAL-COM_T2.ReportProfilesMsgPack" bytes <msgpack_data>

# Clear all profiles
rbuscli setv "Device.X_RDKCENTRAL-COM_T2.ReportProfiles" string '{"profiles":[]}'

3. DCM Event-Based Reload

Subscribe to DCM reload events via RBUS (typically used by WebConfig framework):

# Publish DCM reload event
rbuscli publish Device.X_RDKCENTREL-COM.Reloadconfig

4. Using Test Utilities

The project includes a convenience script for testing profile updates:

# Load example profile
./test/set_report_profile.sh example

# Load DOCSIS reference profile
./test/set_report_profile.sh docsis

# Clear all profiles
./test/set_report_profile.sh empty

# Load custom JSON profile
./test/set_report_profile.sh '{"profiles":[...]}'

Available RBUS Parameters:

  • Device.X_RDKCENTRAL-COM_T2.ReportProfiles - Persistent report profiles (JSON)
  • Device.X_RDKCENTRAL-COM_T2.ReportProfilesMsgPack - Persistent profiles (MessagePack binary)
  • Device.X_RDKCENTRAL-COM_T2.Temp_ReportProfiles - Temporary profiles (JSON)
  • Device.X_RDKCENTRAL-COM_T2.UploadDCMReport - Trigger on-demand report upload
  • Device.X_RDKCENTRAL-COM_T2.AbortDCMReport - Abort ongoing report upload

Development

Running Tests

# Unit tests
make check

# Functional tests
cd test
./run_ut.sh

# Code coverage
./cov_build.sh

Development Container

Use the provided Docker container for consistent development: https://github.com/rdkcentral/docker-device-mgt-service-test

cd docker-device-mgt-service-test
docker compose up -d

A directory above the current directory is mounted as a volume in /mnt/L2_CONTAINER_SHARED_VOLUME . Login to the container as follows:

docker exec -it native-platform /bin/bash
cd /mnt/L2_CONTAINER_SHARED_VOLUME/telemetry
sh test/run_ut.sh

See Docker Development Guide for more details.

Platform Support

Telemetry 2.0 is designed to be platform-independent and has been tested on:

  • RDK-B (Broadband devices)
  • RDK-V (Video devices)
  • Linux (x86_64, ARM, ARM64)
  • Yocto Project builds

See Platform Porting Guide for porting to new platforms.

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines.

Development Workflow

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Add tests for new functionality
  5. Ensure all L1 and L2 tests pass
  6. Commit your changes (git commit -m 'Add amazing feature')
  7. Push to the branch (git push origin feature/amazing-feature)
  8. Open a Pull Request

Code Style

  • Follow existing C code style and ensure astyle formatting and checks pass with below commands
          find . -name '*.c' -o -name '*.h' | xargs astyle --options=.astylerc
          find . -name '*.orig' -type f -delete
  • Use descriptive variable names
  • Document all public APIs
  • Add unit tests for new functions
  • Add functional tests for new features

See Coding Guidelines for details.

Troubleshooting

Common Issues

Q: Telemetry not sending reports

  • Check network connectivity
  • Verify XConf URL configuration
  • Review logs in /var/log/telemetry/

Q: High memory usage

  • Reduce number of active profiles
  • Decrease reporting intervals
  • Check for memory leaks with valgrind

Q: Build errors

  • Ensure all dependencies installed
  • Check compiler version (GCC 4.8+)
  • Review build logs for missing libraries

See Troubleshooting Guide for more solutions.

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Acknowledgments

  • RDK Management LLC
  • RDK Community Contributors
  • Open Source Community

Contact

Changelog

See CHANGELOG.md for version history and release notes.


Built for the RDK Community

About

No description or website provided.

Topics

Resources

Contributing

Security policy

Stars

Watchers

Forks

Packages

Used by

Contributors

Languages