#include <iostream>
#include <thread>
#include <chrono>
int main(
int argc,
char* argv[]) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " <plugin_path>\n";
std::cerr << "Example: " << argv[0] << " ./libexample_plugin.so\n";
return 1;
}
std::string plugin_path = argv[1];
std::cout << "=== Dynamic Plugin Loading Example ===\n\n";
auto& registry = collector_registry::instance();
std::cout << "Loading plugin from: " << plugin_path << "\n";
if (!registry.load_plugin(plugin_path)) {
std::cerr << "Failed to load plugin: "
<< registry.get_plugin_loader_error() << "\n";
return 1;
}
std::cout << "Plugin loaded successfully\n\n";
auto* plugin = registry.get_plugin("example_plugin");
if (!plugin) {
std::cerr << "Plugin not found in registry\n";
return 1;
}
auto metadata = plugin->get_metadata();
std::cout << "Plugin Metadata:\n";
std::cout << " Name: " << plugin->name() << "\n";
std::cout << " Description: " << metadata.description << "\n";
std::cout << " Version: " << metadata.version << "\n";
std::cout << " Available: " << (plugin->is_available() ? "yes" : "no") << "\n\n";
std::cout << "Initializing plugin...\n";
if (!plugin->initialize(config)) {
std::cerr << "Failed to initialize plugin\n";
return 1;
}
std::cout << "Plugin initialized\n\n";
std::cout << "Collecting metrics (5 iterations)...\n";
for (int i = 0; i < 5; ++i) {
std::cout << "\nIteration " << (i + 1) << ":\n";
auto metrics = plugin->collect();
for (
const auto&
metric : metrics) {
std::cout << " [";
bool first = true;
for (
const auto& [key, value] :
metric.labels) {
if (!first) std::cout << ", ";
std::cout << key << "=" << value;
first = false;
}
std::cout << "]";
}
std::cout << "\n";
}
if (i < 4) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
std::cout << "\nShutting down plugin...\n";
plugin->shutdown();
std::cout << "Unloading plugin...\n";
if (!registry.unload_plugin("example_plugin")) {
std::cerr << "Failed to unload plugin\n";
return 1;
}
std::cout << "Plugin unloaded successfully\n";
std::cout << "\n=== Example Complete ===\n";
return 0;
}
Registry for managing collector plugin lifecycle.
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
Dynamic plugin loading from shared libraries.
Basic metric structure for interface compatibility.
std::variant< double, int64_t, std::string > value