snmp2otel pravidelně posílá SNMPv2c GET dotazy na zadaného agenta a hodnoty, které dostane zpátky, přeposílá dál jako OpenTelemetry metriky — most mezi starým světem síťového monitoringu (SNMP) a moderním observability stackem (OTEL).
Zajímá ho jen skalární OID (ty, co končí .0) — typicky čítače a měřidla z MIB tabulky agenta, ne celé podstromy.
Simple Network Management Protocol je standard ze začátku devadesátých let, kterým se dodnes vyčítají údaje z routerů, switchů, tiskáren nebo záložních zdrojů. Když někde visí graf vytížení firemní linky, je docela pravděpodobné, že data pod ním tekla přes SNMP.
1.3.6.1.2.1.1.3.0 je doba běhu zařízení od zapnutí.GetRequest se seznamem OID a agent odpoví toutéž strukturou doplněnou o hodnoty.Koncovka .0 u OID znamená skalární hodnotu, tedy jedno konkrétní číslo, ne tabulku. Program schválně zpracovává jen tyhle — u tabulek by musel řešit procházení podstromu, což je jiná úloha.
OpenTelemetry je otevřený standard pro sběr telemetrie — metrik, trasování a logů — nezávislý na dodavateli. Řeší stav, kdy měl každý monitorovací nástroj vlastní formát i vlastního agenta a přechod jinam znamenal předělat instrumentaci celé aplikace.
Proč tedy stavět most: zařízení mluvící SNMP jsou všude a hned tak nezmizí, ale moderní observability stack mluví OTLP. Exportér je překladatel mezi těmi dvěma světy.
Na vstupu je adresa agenta a soubor se seznamem OID (jedno na řádek, komentáře přes #), na výstupu JSON tělo požadavku, které program pošle na OTLP/HTTP endpoint kolektoru:
./snmp2otel -t 127.0.0.1 -o ./oids.txt \
-e http://127.0.0.1:4318/v1/metrics -p 1161 -v
# oids.txt:
1.3.6.1.2.1.1.3.0
1.3.6.1.4.1.9999.1.1.0
1.3.6.1.4.1.9999.1.2.0
1.3.6.1.4.1.9999.1.3.0{
"resourceMetrics": [{
"resource": { "attributes": [
{ "key": "service.name",
"value": { "stringValue": "snmp2otel" } }
]},
"scopeMetrics": [{
"scope": { "name": "snmp2otel" },
"metrics": [{
"name": "snmp.1.3.6.1.2.1.1.3.0",
"unit": "",
"gauge": { "dataPoints": [{
"timeUnixNano": "1732820000000000000",
"asDouble": 483920
}]}
}]
}]
}]
}cli.hpp) načte cíl, community string, port, timeout a interval.ber.cpp) složí SNMPv2c GetRequest paket — žádná externí SNMP knihovna.VarBind hodnot (Integer, OctetString, OID, Counter32, Gauge32, TimeTicks, Counter64…).cpp-httplib POST požadavkem.-i sekund, dokud program běží.Projekt drží hlavičky v include/ a implementaci v src/. Každá dvojice odpovídá jedné vrstvě cesty od příkazové řádky až k odeslanému HTTP požadavku:
| Modul | Zodpovědnost |
|---|---|
| ber | Kódování a dekódování ASN.1/BER — délky, integery, octet stringy, OID, čtení TLV prvků |
| cli | Zpracování přepínačů do struktury Options, výpis usage |
| snmp | Sestavení GetRequest, parsování GetResponse, UDP round-trip s opakováním |
| otel | Rozebrání URL endpointu, sestavení OTLP JSON, odeslání přes HTTP |
| vlog | Verbose logování přes jeden globální přepínač |
| main | Načtení souboru s OID a hlavní dotazovací smyčka |
| tests/ | Testy nad ber, snmp a otel (GoogleTest) |
| third_party/ | cpp-httplib a googletest |
Řazení není náhodné: ber nezná SNMP, snmp nezná OTEL a otel neví, odkud se hodnoty vzaly. Závislosti vedou jedním směrem, takže každou vrstvu jde testovat zvlášť.
| Struktura | Role |
|---|---|
| ber::Bytes | Alias pro vektor bajtů — syrový obsah paketu |
| ber::TLV | Jeden přečtený prvek [tag][délka][hodnota] i s rozsahem hodnoty v bufferu |
| ber::ber_error | Výjimka při poškozeném nebo neočekávaném kódování |
| snmp::VarBindValue | Typovaná hodnota — Integer, OctetString, OID, Counter32, Gauge32, TimeTicks, Counter64 |
| snmp::VarBind | Dvojice OID a jeho hodnota |
| snmp::PDU | Tělo odpovědi: request-id, error-status, error-index a seznam VarBind |
| Options | Konfigurace poskládaná z argumentů příkazové řádky |
| ParsedUrl | Rozebraný endpoint — schéma, host, port a cesta |
Stojí za zmínku, že tříd tu skoro nenajdete — jsou to prosté struktury a volné funkce v namespacech. Je to záměr: program nemá víc implementací téhož rozhraní, mezi kterými by za běhu vybíral. Je to přímá roura z jednoho konce na druhý, a na tu je hierarchie tříd zbytečná váha. U IPK, kde se čtyři protokoly opravdu střídají za společným rozhraním, to vyšlo přesně opačně.
Testy (GoogleTest, složka tests/) pokrývají BER kódování i dekódování, sestavení a parsování SNMP PDU a parsování URL endpointu pro export.