* Reimplement histogram using mutex instead of stateLocker
Move existing implementation to histogram_statelocker.go. Implement
benchmarks for single thread and parallel histogram updates comparing
mutex version to stateLocker version
* Drop statelocker implementation and alignment tests, benchmarks
Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
* Switch MinMaxSumCount to a mutex lock instead of StateLocker
With multiple values being modified for each Update(), a single mutex
lock and non-atomic operations ends up being faster than making each
value update into an atomic operation.
* Remove StateLocker implementation and comparison benchmarks
* Remove field offset tests. No longer required with no atomics.
Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
* Do not put span context into go context if extraction failed
This causes problems if multiple trace propagators are chained,
because the first propagator in chain may extract a valid span
context, then next propagator will overwrite it with an empty span
context when required headers in supplier are missing.
* Test for clobbering propagators
Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
* Bump golangci-lint to 1.25
* Skip the "unused" linter when running golangci-lint in --fix mode
This linter seems to provide bogus fix-up information to
golangci-lint, which results in file corruption instead of fixing the
issue. Since we are going to run the linter again anyway, but without
the --fix mode, skip the "unused" linter explicitly for the first run
- it will still have a chance to report errors on the second run.
* add optional server url arg to http client example
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add Dockerfile to build example http images
Multi-stage Dockerfile with targets for building example http server and
client.
$ docker build --tag the-server --target example-http-server .
$ docker build --tag the-client --target example-http-client .
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add docker-compose.yml file for running examples
This docker compose configuration file will help a new user to compile
and run the example code quickly. Uses the Dockerfile to build images
with compiled examples.
$ docker-compose build http-server http-client
$ docker-compose up http-server http-client
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add newline to last message of example http client
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add optional collector url arg to zipkin client example
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add Dockerfile target to build zipkin client
For building the example zipkin client:
$ docker build --tag zipkin-client --target example-zipkin-client .
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add docker compose service to run zipkin examples
Services to run the zipkin client along with a zipkin collector:
$ docker-compose build zipkin-client
$ docker-compose up zipkin-collector zipkin-client
Since the zipkin collector takes a few seconds before it is ready to
receive traces, I added a simple retry loop to the client command.
The collector service exposes port 9411 so user can visit
http//localhost:9411/ to see the trace sent to the collector. Be sure to
search by the trace id logged by the client.
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* Update Dockerfile with AL2 declaration
As described in https://www.apache.org/licenses/LICENSE-2.0#apply
Co-Authored-By: Tyler Yahn <MrAlias@users.noreply.github.com>
* Update docker-compose.yml with AL2 declaration
As described in https://www.apache.org/licenses/LICENSE-2.0#apply
Co-Authored-By: Tyler Yahn <MrAlias@users.noreply.github.com>
* pass server url as flag in example http client
$ ./client -h
Usage of ./client:
-server string
server url (default "http://localhost:7777/hello")
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* pass zipkin url as flag in example zipkin client
$ ./zipkin -h
Usage of ./zipkin:
-zipkin string
zipkin url (default "http://localhost:9411/api/v2/spans")
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* move Dockerfile and docker-compose.yml into example dir
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add Dockerfile and docker-compose.yml for zipkin example
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* update zipkin example README.md
With instructions on how to use docker-compose to run the example.
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* add http example README.md
With instructions on how to use docker-compose to run the example.
Signed-off-by: Andrew Hsu <xuzuan@gmail.com>
* Update example/http/Dockerfile WORKDIR
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
* Update example/http/Dockerfile RUN go install
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
* Update example/http/Dockerfile RUN go install
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
* Update example/zipkin/Dockerfile WORKDIR
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
* Update example/zipkin/Dockerfile RUN go install
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
Co-authored-by: Krzesimir Nowak <qdlacz@gmail.com>
Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
* New label set API
* Checkpoint
* Remove label.Labels interface
* Fix trace
* Remove label storage
* Restore metric_test.go
* Tidy tests
* More comments
* More comments
* Same changes as 654
* Checkpoint
* Fix batch labels
* Avoid Resource.Attributes() where possible
* Update comments and restore order in resource.go
* From feedback
* From feedback
* Move iterator_test & feedback
* Strenghten the label.Set test
* Feedback on typos
* Fix the set test per @krnowak
* Nit
* Point to the convenience functions in api/key package
This is to increase the visibility of the api/key package through the
api/core package, otherwise developers often tend to miss the api/key
package altogether and write `core.Key(name).TYPE(value)` and complain
at the verbosity of such a construction. The api/key package would
allow them to write `key.TYPE(name, value)`.
* Use the api/key package where applicable
This transforms all the uses of `core.Key(name).TYPE(value)` to
`key.TYPE(name, value)`. This also should help increasing the
visibility of the api/key package for developers reading the otel-go
code.
Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
* TraceID and SpanID implementations for Stringer Interface
* Hex encode while stringifying
* Modify format specifiers wherever SpanID is used
* comment changes
* Remove TraceIdString() and SpanIdString()
* Comments Fixes
* Add check to sum transform for unknown NumberKind
* Initial batching
* Move CheckpointSet transform to internal package
* Add tests for the Exporter Export method
Check batching and general output exporter ResourceMetrics are correct.
* Check errors in tests
* Apply suggestions from code review
Co-Authored-By: Krzesimir Nowak <qdlacz@gmail.com>
* Use var instead of multiple calls for group IDs
* Fix otlp metric test reporting
Co-authored-by: Krzesimir Nowak <qdlacz@gmail.com>
* prometheus: add error wrapping
This PR adds error wrapping to the prometheus exporter.
The added context should make it easier to follow the error path.
This is a follow-up to #622
* feedback
* othttp: add RemoteAddrKey for HTTP client address
Include the requesting HTTP client's network address in each top-level
span emitted by othttp.NewHandler.
* Copyedit documentation for attribute keys
Instead of batching based on the Resource pointer which is not guaranteed
to uniquely identify common Resources, use the `String` method which is.
Renames the external test package to be identified as the integration
testing. This testing structure (the mock exporter) batches exported
resources transmitted from the resource. This is needed as there is no
guarantees that a batch will be exported in a single payload, therefore,
it is not an ideal place to add resource batch testing for the exporter
itself.
Add unit tests to ensure the Exporter is correctly batching spans by
resource.
* Update OTLP SpanData transform
The ParentSpanId needs to be empty for root spans according to the OTLP
[docs](6c2a86ed2f/gen/go/trace/v1/trace.pb.go (L284-L286)).
This updates the SpanData transform function to not add the ParentSpanID
if it is not a valid span ID (which includes if it is the nil span ID
used for an unset ID).
Additionally, this adds a test to prevent regression.
* Simplify test to just check parent span ID transform
Co-authored-by: Rahul Patel <rahulpa@google.com>
* Update Resource
When looking at grouping telemetry in an exporter based on the Resource
it is ideal if a map can be make with the key being represented by a
Resource. However, given the Resource is not hashable, this is not
possible.
This add a `String` method that can be used as a map key during
grouping. Additionally, this means the Resource now implements the
`Stringer` interface providing human-readable info when prited.
The internal structure of the Resource is changed. A static slice
containing all key-values in a sorted order replaces the existing map.
Additionally a set of keys is added to accommodate lookup during
`Merge`. Also, the string representation is kept in an internal field so
as to save processing for the `String` method (all fields are assumed to
be static after creation).
The `Attributes` method now returns a sorted slice of the associated
key-values.
The `Merge` method has been updated to support the changed structure of
the Resource.
New tests are added to validate the `String` method.
* Update comment
* Change loop into returned append
* Update key-value less func
Keys are unique in this package, treat them that way.
* Remove unnecessary allocation on empty attributes
* Update `Merge` method
Remove incomplete sorting of merged slices. Instead use the `sort`
package.
Add tests to catch sorting failure identified.
* Apply suggestions from code review
Co-Authored-By: ET <evantorrie@users.noreply.github.com>
* Escape Resource string representation
To ensure uniqueness of the string representation, the key-value content
needs to be escaped.
* Switch to an eager evaluation for the `String` method
* Refactor `Merge` method
Leave optimization to the future and simplify the merge.
* Add AttributeIterator
Include a method for a user of the Resource to iterate over the related
attributes without needed to copy the attributes.
* Fix ineffectual
* Fix lint
* Add licenses
* keys -> keySet for Resource
Co-authored-by: ET <evantorrie@users.noreply.github.com>
Co-authored-by: Rahul Patel <rahulpa@google.com>
This PR modifies prometheus.Collect to reflect the change introduced
by #557.
The `export{Counter,Histogram,LastValue,Summary}` methods now all return
an error instead of calling the error callback directly.
The callback is now only called on the returned error from `ForEach`.
fixes#563
Co-authored-by: Rahul Patel <rahulpa@google.com>
* Ensure spans created by httptrace client tracer reflect operation structure
* Cleanup (clientTracer).start based on PR feedback
* Ensure a span is recorded even if end() is called before start()
* Ensure start attributes for spans started by (clientTracer).end() are recorded
Co-authored-by: Rahul Patel <rahulpa@google.com>
This PR adds histogram support to the prometheus exporter.
- Adds a new aggregator selector that returns a histogram for `MeasureKind`.
The selector can be constructed using `simple.NewWithHistogramMeasure`
- Adds support for histogram aggregators in prometheus collect method.
With this PR, the default selector is changed to use histograms.
In order to support the prometheus histogram, the `aggregator.Histogram`
interface is extended with the `Sum` method.
fixes#487
Co-authored-by: Rahul Patel <rahulpa@google.com>