Skip to content

Commit

Permalink
[receiver/riak] Riak Metric Receiver (open-telemetry#8548)
Browse files Browse the repository at this point in the history
* Add riakreceiver
  • Loading branch information
armstrmi committed Apr 7, 2022
1 parent 129b983 commit cd25661
Show file tree
Hide file tree
Showing 34 changed files with 5,554 additions and 1 deletion.
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ receiver/prometheusreceiver/ @open-telemetry/collector-c
receiver/rabbitmqreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @cpheps
receiver/receivercreator/ @open-telemetry/collector-contrib-approvers @jrcamp
receiver/redisreceiver/ @open-telemetry/collector-contrib-approvers @pmcollins @dmitryax
receiver/riakreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @armstrmi
receiver/sapmreceiver/ @open-telemetry/collector-contrib-approvers @owais
receiver/signalfxreceiver/ @open-telemetry/collector-contrib-approvers @pjanotti @dmitryax
receiver/skywalkingreceiver @open-telemetry/collector-contrib-approvers @JaredTan95
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## Unreleased

### 💡 Enhancements 💡
- `riakreceiver`: Added implementation of Riak Metric Receiver (#8548)
- `splunkhecexporter`: Add support for batching traces (#8995)
- `hostmetricsreceiver`: Migrate Processes scraper to the Metrics builder (#8855)
- `tanzuobservabilityexporter`: Use resourcetotelemetry helper (#8338)
Expand Down Expand Up @@ -2002,4 +2003,4 @@ First release of OpenTelemetry Collector Contrib.
[v0.2.7]: https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.2.6...v0.2.7
[v0.2.6]: https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.0.5...v0.2.6
[v0.0.5]: https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.0.1...v0.0.5
[v0.0.1]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.0.1
[v0.0.1]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.0.1
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ INTEGRATION_TEST_MODULES := \
receiver/nginxreceiver \
receiver/postgresqlreceiver \
receiver/redisreceiver \
receiver/riakreceiver \
receiver/zookeeperreceiver \
extension/observer/dockerobserver

Expand Down
3 changes: 3 additions & 0 deletions cmd/configschema/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,7 @@ require (
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.48.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.0.0-00010101000000-000000000000 // indirect
Expand Down Expand Up @@ -758,6 +759,8 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/recei

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver => ../../receiver/redisreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver => ../../receiver/riakreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ../../receiver/sapmreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ../../receiver/signalfxreceiver
Expand Down
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ require (
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.48.0
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.0.0-00010101000000-000000000000
Expand Down Expand Up @@ -762,6 +763,8 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/recei

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver => ./receiver/redisreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver => ./receiver/riakreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ./receiver/sapmreceiver

replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ./receiver/signalfxreceiver
Expand Down
2 changes: 2 additions & 0 deletions internal/components/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ import (
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver"
Expand Down Expand Up @@ -207,6 +208,7 @@ func Components() (component.Factories, error) {
prometheusreceiver.NewFactory(),
receivercreator.NewFactory(),
redisreceiver.NewFactory(),
riakreceiver.NewFactory(),
sapmreceiver.NewFactory(),
signalfxreceiver.NewFactory(),
simpleprometheusreceiver.NewFactory(),
Expand Down
3 changes: 3 additions & 0 deletions internal/components/receivers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,9 @@ func TestDefaultReceivers(t *testing.T) {
{
receiver: "redis",
},
{
receiver: "riak",
},
{
receiver: "sapm",
},
Expand Down
1 change: 1 addition & 0 deletions receiver/riakreceiver/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
36 changes: 36 additions & 0 deletions receiver/riakreceiver/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Riak Receiver

Riak metrics will be collected from the [/stats](https://docs.riak.com/riak/kv/2.2.3/developing/api/http/status.1.html) endpoint.

This Riak receiver will collect metrics for [3.x+](https://github.com/basho/riak/releases)

Supported pipeline types: `metrics`

## Configuration

The following configuration settings are required:

- `username`
- `password`

The following configuration settings are optional:

- `endpoint` (default: `http:https://localhost:8098`): The URL of the node to be monitored.
- `collection_interval` (default = `60s`): This receiver collects metrics on an interval. Valid time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`.
- `tls` (defaults defined [here](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md)): TLS control. By default insecure settings are rejected and certificate verification is on.

### Example Configuration

```yaml
receivers:
riak:
endpoint: http:https://localhost:8098
username: otelu
password: $RIAK_PASSWORD
collection_interval: 60s
```

## Metrics

Details about the metrics produced by this receiver can be found in [metadata.yaml](./metadata.yaml)

125 changes: 125 additions & 0 deletions receiver/riakreceiver/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http:https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package riakreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver"

import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"

"go.opentelemetry.io/collector/component"
"go.uber.org/zap"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver/internal/model"
)

// statsPath is the path to stats endpoint
const statsPath = "/stats"

type client interface {
// GetStats calls "/stats" endpoint to get list of stats for the target node
GetStats(ctx context.Context) (*model.Stats, error)
}

var _ client = (*riakClient)(nil)

type riakClient struct {
client *http.Client
hostEndpoint string
creds riakCredentials
logger *zap.Logger
}

type riakCredentials struct {
username string
password string
}

func newClient(cfg *Config, host component.Host, settings component.TelemetrySettings, logger *zap.Logger) (client, error) {
httpClient, err := cfg.ToClient(host.GetExtensions(), settings)
if err != nil {
return nil, fmt.Errorf("failed to create HTTP Client: %w", err)
}

return &riakClient{
client: httpClient,
hostEndpoint: cfg.Endpoint,
creds: riakCredentials{
username: cfg.Username,
password: cfg.Password,
},
logger: logger,
}, nil
}

func (c *riakClient) GetStats(ctx context.Context) (*model.Stats, error) {
var stats *model.Stats

if err := c.get(ctx, statsPath, &stats); err != nil {
c.logger.Debug("Failed to retrieve stats", zap.Error(err))
return nil, err
}

return stats, nil
}

func (c *riakClient) get(ctx context.Context, path string, respObj interface{}) error {
// Construct endpoint and create request
url := c.hostEndpoint + path
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody)
if err != nil {
return fmt.Errorf("failed to create get request for path %s: %w", path, err)
}

// Set user/pass authentication
req.SetBasicAuth(c.creds.username, c.creds.password)

// Make request
resp, err := c.client.Do(req)
if err != nil {
return fmt.Errorf("failed to make http request: %w", err)
}

// Defer body close
defer func() {
if closeErr := resp.Body.Close(); closeErr != nil {
c.logger.Warn("failed to close response body", zap.Error(closeErr))
}
}()

// Check for OK status code
if resp.StatusCode != http.StatusOK {
c.logger.Debug("riak API non-200", zap.Error(err), zap.Int("status_code", resp.StatusCode))

// Attempt to extract the error payload
payloadData, err := io.ReadAll(resp.Body)
if err != nil {
c.logger.Debug("failed to read payload error message", zap.Error(err))
} else {
c.logger.Debug("riak API Error", zap.ByteString("api_error", payloadData))
}

return fmt.Errorf("non 200 code returned %d", resp.StatusCode)
}

// Decode the payload into the passed in response object
if err := json.NewDecoder(resp.Body).Decode(respObj); err != nil {
return fmt.Errorf("failed to decode response payload: %w", err)
}

return nil
}
Loading

0 comments on commit cd25661

Please sign in to comment.