# References

> Source: https://www.ymotongpoo.com/books/tinygo-otel-esp32/99-references/


This page lists the primary sources that this book refers to. The content at each link is as of the time of writing (October 2026).

## OpenTelemetry specifications

- [OTLP Specification](https://opentelemetry.io/docs/specs/otlp/): The specification that defines the OTLP transports, the protobuf and JSON encodings, the responses that qualify for a retry, and partialSuccess
- [opentelemetry-proto](https://github.com/open-telemetry/opentelemetry-proto): The protobuf schema for OTLP. The hand-written encoder in this book follows the field numbers in v1.11.0
- [Metrics Data Model](https://opentelemetry.io/docs/specs/otel/metrics/data-model/): How the data model treats gauge, cumulative sum, and `StartTimeUnixNano`
- [Logs Data Model](https://opentelemetry.io/docs/specs/otel/logs/data-model/): The timestamps and severity of log records
- [Deployment environment](https://opentelemetry.io/docs/specs/semconv/resource/deployment-environment/): The semantic convention for the resource attribute `deployment.environment.name`

## OpenTelemetry implementations

- [OpenTelemetry Go](https://opentelemetry.io/docs/languages/go/): The official documentation for the Go API and SDK
- [opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go): The Go SDK repository
- [go.opentelemetry.io/otel/sdk/metric](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric): The metrics SDK
- [otlpmetrichttp](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp): The OTLP/HTTP metrics exporter
- [go.opentelemetry.io/proto/otlp](https://pkg.go.dev/go.opentelemetry.io/proto/otlp): The Go types generated from the OTLP protobuf
- [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/): The official documentation for the Collector
- [opentelemetry-collector-contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib): The Collector distribution and the additional components that this book uses
- [resource processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/resourceprocessor): A processor that rewrites resource attributes
- [batch processor](https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor): A processor that groups data into batches before it sends them

## OpenTelemetry and embedded devices

- [open-telemetry/community#2160](https://github.com/open-telemetry/community/issues/2160): The issue that proposed a working group to build an implementation for embedded devices
- [Ted Young's comment on open-telemetry/community#2160](https://github.com/open-telemetry/community/issues/2160#issuecomment-2182361878): A remark that OpenTelemetry is not designed for embedded devices
- [opentelemetry-cpp#2483](https://github.com/open-telemetry/opentelemetry-cpp/issues/2483): The issue "Add support for embedded devices?", which asked opentelemetry-cpp to support embedded devices
- [Instrumenting my espresso machine with OpenTelemetry](https://clickhouse.com/blog/espresso-machine-observability-with-otel): A blog post by ClickHouse. It describes a case in which the control board of an espresso machine, which runs on an ESP32, sent OTLP
- [GaggiMate](https://gaggimate.eu/): The open-source control board for espresso machines that the ClickHouse case used. It runs on an ESP32
- [nanopb](https://github.com/nanopb/nanopb): A protobuf implementation in C for embedded devices
- [ESP32 Firmware to OpenTelemetry](https://docs.base14.io/instrument/iot/esp32/): Documentation by base14. It describes a setup that collects telemetry from an ESP32 through MQTT and a bridge

## TinyGo and drivers

- [TinyGo](https://tinygo.org/): A Go compiler for microcontrollers and WebAssembly
- [tinygo-org/tinygo](https://github.com/tinygo-org/tinygo): The TinyGo repository
- [tinygo-otel-esp32](https://github.com/ymotongpoo/tinygo-otel-esp32): The reference implementation for this book. It contains the code shown in the text, the Collector configuration, and the Grafana dashboard
- [tinygo-org/tinygo#5554](https://github.com/tinygo-org/tinygo/pull/5554): The pull request that adds PSRAM support for the ESP32-S3
- [espradio](https://github.com/tinygo-org/espradio): A driver that lets TinyGo programs use the Wi-Fi on an ESP32
- [lneto](https://github.com/soypat/lneto): The TCP/IP stack that espradio uses

## Go and protobuf

- [protobuf-go](https://github.com/protocolbuffers/protobuf-go): The protobuf runtime for Go
- [dynamicpb](https://pkg.go.dev/google.golang.org/protobuf/types/dynamicpb): A protobuf message type that handles schemas at run time
- [protojson](https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson): An implementation of the JSON mapping for protobuf
- [Protocol Buffers](https://protobuf.dev/): The official protobuf documentation
- [Encoding](https://protobuf.dev/programming-guides/encoding/): An explanation of the protobuf wire format
- [encoding/json](https://pkg.go.dev/encoding/json): The JSON package in the Go standard library
- [crypto/rand](https://pkg.go.dev/crypto/rand): The package for cryptographic random numbers in the Go standard library
- [golang.org/x/sys/unix](https://pkg.go.dev/golang.org/x/sys/unix): Go bindings for Unix system calls

## Protocols

- [RFC 4330](https://www.rfc-editor.org/rfc/rfc4330): Simple Network Time Protocol (SNTP) Version 4
- [MQTT](https://mqtt.org/): The messaging protocol that the base14 case uses between the device and the bridge

## Hardware

- [M5Stack CoreS3](https://docs.m5stack.com/en/core/CoreS3): The product documentation for the device that this book uses
- [ESP32-S3](https://www.espressif.com/en/products/socs/esp32-s3): The Espressif product page
- [ESP32-S3 Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf): The ESP32-S3 datasheet
- [ESP32-S3 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf): The ESP32-S3 technical reference manual
- [Wi-Fi API (ESP-IDF)](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/network/esp_wifi.html): The Wi-Fi API reference, which includes `esp_wifi_sta_get_rssi`

## Backends and tools

- [grafana/docker-otel-lgtm](https://github.com/grafana/docker-otel-lgtm): A container image that bundles an OTLP endpoint with Prometheus, Loki, Tempo, and Grafana
- [Grafana](https://grafana.com/oss/grafana/)
- [Prometheus](https://prometheus.io/)
- [Loki](https://grafana.com/oss/loki/)
- [Tempo](https://grafana.com/oss/tempo/)
- [Span metrics](https://grafana.com/docs/tempo/latest/metrics-generator/span_metrics/): The Tempo feature that generates metrics from spans
- [Docker Compose](https://docs.docker.com/compose/)

## Issues that I reported from the research for this book

Of the constraints that I found in the research for this book, I reported the following five to the projects on October 7, 2026.

- [tinygo-org/espradio#75](https://github.com/tinygo-org/espradio/issues/75): A report that a program connected through `netlink` has no way to set the clock (Chapter 8)
- [tinygo-org/espradio#76](https://github.com/tinygo-org/espradio/issues/76): A proposal for a function that returns the RSSI of the connected access point (Chapter 10)
- [tinygo-org/tinygo#5839](https://github.com/tinygo-org/tinygo/issues/5839): A report that on the ESP32-S3, TinyGo does not report a goroutine stack overflow as `goroutine stack overflow`. The program stops silently or crashes with a different error (Chapter 9)
- [Comment on tinygo-org/tinygo#5204](https://github.com/tinygo-org/tinygo/issues/5204#issuecomment-6036833704): A case in which `otlpmetrichttp` does not build because `tls.X509KeyPair` is missing (Chapter 4)
- [Comment on tinygo-org/tinygo#3862](https://github.com/tinygo-org/tinygo/issues/3862#issuecomment-6036834071): A case in which `proto.Marshal` in protobuf-go panics because `(reflect.Type).MethodByName` is not implemented (Chapter 5)

