diff --git a/plugins/inputs/all/cassandra.go b/plugins/inputs/all/cassandra.go deleted file mode 100644 index 6945325fa..000000000 --- a/plugins/inputs/all/cassandra.go +++ /dev/null @@ -1,5 +0,0 @@ -//go:build !custom || inputs || inputs.cassandra - -package all - -import _ "github.com/influxdata/telegraf/plugins/inputs/cassandra" // register plugin diff --git a/plugins/inputs/cassandra/README.md b/plugins/inputs/cassandra/README.md deleted file mode 100644 index 871acad20..000000000 --- a/plugins/inputs/cassandra/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# Cassandra Input Plugin - -**Deprecated in version 1.7**: Please use the [jolokia2](../jolokia2/README.md) -plugin with the [cassandra.conf](../jolokia2/examples/cassandra.conf) example -configuration. - -## Plugin arguments - -- **context** string: Context root used for jolokia url -- **servers** []string: List of servers with the format `:port`" -- **metrics** []string: List of Jmx paths that identify mbeans attributes - -## Description - -The Cassandra plugin collects Cassandra 3 / JVM metrics exposed as MBean's -attributes through jolokia REST endpoint. All metrics are collected for each -server configured. - -See: [https://jolokia.org/](https://jolokia.org/) and [Cassandra -Documentation][1] - -[1]: http://docs.datastax.com/en/cassandra/3.x/cassandra/operations/monitoringCassandraTOC.html - -## Metrics - -Cassandra plugin produces one or more measurements for each metric configured, -adding Server's name as `host` tag. More than one measurement is generated when -querying table metrics with a wildcard for the keyspace or table name. - -## Global configuration options - -In addition to the plugin-specific configuration settings, plugins support -additional global and plugin configuration settings. These settings are used to -modify metrics, tags, and field or create aliases and configure ordering, etc. -See the [CONFIGURATION.md][CONFIGURATION.md] for more details. - -[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins - -## Configuration - -```toml @sample.conf -# Read Cassandra metrics through Jolokia -[[inputs.cassandra]] - context = "/jolokia/read" - ## List of cassandra servers exposing jolokia read service - servers = ["myuser:mypassword@10.10.10.1:8778","10.10.10.2:8778",":8778"] - ## List of metrics collected on above servers - ## Each metric consists of a jmx path. - ## This will collect all heap memory usage metrics from the jvm and - ## ReadLatency metrics for all keyspaces and tables. - ## "type=Table" in the query works with Cassandra3.0. Older versions might - ## need to use "type=ColumnFamily" - metrics = [ - "/java.lang:type=Memory/HeapMemoryUsage", - "/org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=ReadLatency" - ] -``` - -## Example Output - -```text -javaMemory,host=myHost,mname=HeapMemoryUsage HeapMemoryUsage_committed=1040187392,HeapMemoryUsage_init=1050673152,HeapMemoryUsage_max=1040187392,HeapMemoryUsage_used=368155000 1459551767230567084 -``` - -## Useful Metrics - -Here is a list of metrics that might be useful to monitor your cassandra -cluster. This was put together from multiple sources on the web. - -- [How to monitor Cassandra performance metrics](https://www.datadoghq.com/blog/how-to-monitor-cassandra-performance-metrics) -- [Cassandra Documentation](http://docs.datastax.com/en/cassandra/3.x/cassandra/operations/monitoringCassandraTOC.html) - -### measurement = javaGarbageCollector - -- /java.lang:type=GarbageCollector,name=ConcurrentMarkSweep/CollectionTime -- /java.lang:type=GarbageCollector,name=ConcurrentMarkSweep/CollectionCount -- /java.lang:type=GarbageCollector,name=ParNew/CollectionTime -- /java.lang:type=GarbageCollector,name=ParNew/CollectionCount - -### measurement = javaMemory - -- /java.lang:type=Memory/HeapMemoryUsage -- /java.lang:type=Memory/NonHeapMemoryUsage - -### measurement = cassandraCache - -- /org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Hits -- /org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Requests -- /org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Entries -- /org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Size -- /org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Capacity -- /org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Hits -- /org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Requests -- /org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Entries -- /org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Size -- /org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Capacity - -### measurement = cassandraClient - -- /org.apache.cassandra.metrics:type=Client,name=connectedNativeClients - -### measurement = cassandraClientRequest - -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=TotalLatency -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=TotalLatency -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Latency -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Timeouts -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Timeouts -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Unavailables -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Unavailables -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Failures -- /org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Failures - -### measurement = cassandraCommitLog - -- /org.apache.cassandra.metrics:type=CommitLog,name=PendingTasks -- /org.apache.cassandra.metrics:type=CommitLog,name=TotalCommitLogSize - -### measurement = cassandraCompaction - -- /org.apache.cassandra.metrics:type=Compaction,name=CompletedTasks -- /org.apache.cassandra.metrics:type=Compaction,name=PendingTasks -- /org.apache.cassandra.metrics:type=Compaction,name=TotalCompactionsCompleted -- /org.apache.cassandra.metrics:type=Compaction,name=BytesCompacted - -### measurement = cassandraStorage - -- /org.apache.cassandra.metrics:type=Storage,name=Load -- /org.apache.cassandra.metrics:type=Storage,name=Exceptions - -### measurement = cassandraTable - -Using wildcards for "keyspace" and "scope" can create a lot of series as metrics -will be reported for every table and keyspace including internal system -tables. Specify a keyspace name and/or a table name to limit them. - -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=LiveDiskSpaceUsed -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=TotalDiskSpaceUsed -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=ReadLatency -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=CoordinatorReadLatency -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=WriteLatency -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=ReadTotalLatency -- /org.apache.cassandra.metrics:type=Table,keyspace=\*,scope=\*,name=WriteTotalLatency - -### measurement = cassandraThreadPools - -- /org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=ActiveTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=AntiEntropyStage,name=ActiveTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=CounterMutationStage,name=PendingTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=CounterMutationStage,name=CurrentlyBlockedTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=PendingTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=CurrentlyBlockedTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadRepairStage,name=PendingTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadRepairStage,name=CurrentlyBlockedTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=PendingTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=CurrentlyBlockedTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=RequestResponseStage,name=PendingTasks -- /org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=RequestResponseStage,name=CurrentlyBlockedTasks diff --git a/plugins/inputs/cassandra/cassandra.go b/plugins/inputs/cassandra/cassandra.go deleted file mode 100644 index 5b79ad335..000000000 --- a/plugins/inputs/cassandra/cassandra.go +++ /dev/null @@ -1,302 +0,0 @@ -//go:generate ../../../tools/readme_config_includer/generator -package cassandra - -import ( - _ "embed" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/influxdata/telegraf" - "github.com/influxdata/telegraf/plugins/inputs" -) - -//go:embed sample.conf -var sampleConfig string - -type JolokiaClient interface { - MakeRequest(req *http.Request) (*http.Response, error) -} - -type JolokiaClientImpl struct { - client *http.Client -} - -func (c JolokiaClientImpl) MakeRequest(req *http.Request) (*http.Response, error) { - return c.client.Do(req) -} - -type Cassandra struct { - jClient JolokiaClient - Context string `toml:"context"` - Servers []string `toml:"servers"` - Metrics []string `toml:"metrics"` - Log telegraf.Logger `toml:"-"` -} - -type javaMetric struct { - host string - metric string - acc telegraf.Accumulator -} - -type cassandraMetric struct { - host string - metric string - acc telegraf.Accumulator -} - -type jmxMetric interface { - addTagsFields(out map[string]interface{}) -} - -func newJavaMetric(acc telegraf.Accumulator, host string, metric string) *javaMetric { - return &javaMetric{host: host, metric: metric, acc: acc} -} - -func newCassandraMetric(acc telegraf.Accumulator, host string, metric string) *cassandraMetric { - return &cassandraMetric{host: host, metric: metric, acc: acc} -} - -func addValuesAsFields(values map[string]interface{}, fields map[string]interface{}, - mname string) { - for k, v := range values { - switch v.(type) { - case int64, float64, string, bool: - fields[mname+"_"+k] = v - } - } -} - -func parseJmxMetricRequest(mbean string) map[string]string { - tokens := make(map[string]string) - classAndPairs := strings.Split(mbean, ":") - switch classAndPairs[0] { - case "org.apache.cassandra.metrics": - tokens["class"] = "cassandra" - case "java.lang": - tokens["class"] = "java" - default: - return tokens - } - - pairs := strings.Split(classAndPairs[1], ",") - for _, pair := range pairs { - p := strings.Split(pair, "=") - tokens[p[0]] = p[1] - } - return tokens -} - -func addTokensToTags(tokens map[string]string, tags map[string]string) { - for k, v := range tokens { - if k == "name" { - tags["mname"] = v // name seems to a reserved word in influxdb - } else if k == "class" || k == "type" { - continue // class and type are used in the metric name - } else { - tags[k] = v - } - } -} - -func (j javaMetric) addTagsFields(out map[string]interface{}) { - tags := make(map[string]string) - fields := make(map[string]interface{}) - - a := out["request"].(map[string]interface{}) - attribute := a["attribute"].(string) - mbean := a["mbean"].(string) - - tokens := parseJmxMetricRequest(mbean) - addTokensToTags(tokens, tags) - tags["cassandra_host"] = j.host - - if _, ok := tags["mname"]; !ok { - //Queries for a single value will not return a "name" tag in the response. - tags["mname"] = attribute - } - - if values, ok := out["value"]; ok { - switch t := values.(type) { - case map[string]interface{}: - addValuesAsFields(values.(map[string]interface{}), fields, attribute) - case int64, float64, string, bool: - fields[attribute] = t - } - j.acc.AddFields(tokens["class"]+tokens["type"], fields, tags) - } else { - j.acc.AddError(fmt.Errorf("missing key 'value' in %q output response: %v", j.metric, out)) - } -} - -func addCassandraMetric(mbean string, c cassandraMetric, values map[string]interface{}) { - tags := make(map[string]string) - fields := make(map[string]interface{}) - tokens := parseJmxMetricRequest(mbean) - addTokensToTags(tokens, tags) - tags["cassandra_host"] = c.host - addValuesAsFields(values, fields, tags["mname"]) - c.acc.AddFields(tokens["class"]+tokens["type"], fields, tags) -} - -func (c cassandraMetric) addTagsFields(out map[string]interface{}) { - r := out["request"] - - tokens := parseJmxMetricRequest(r.(map[string]interface{})["mbean"].(string)) - // Requests with wildcards for keyspace or table names will return nested - // maps in the json response - if (tokens["type"] == "Table" || tokens["type"] == "ColumnFamily") && (tokens["keyspace"] == "*" || - tokens["scope"] == "*") { - valuesMap, ok := out["value"] - if !ok { - c.acc.AddError(fmt.Errorf("missing key 'value' in %q output response: %v", c.metric, out)) - return - } - for k, v := range valuesMap.(map[string]interface{}) { - addCassandraMetric(k, c, v.(map[string]interface{})) - } - } else { - values, ok := out["value"] - if !ok { - c.acc.AddError(fmt.Errorf("missing key 'value' in %q output response: %v", c.metric, out)) - return - } - addCassandraMetric(r.(map[string]interface{})["mbean"].(string), c, values.(map[string]interface{})) - } -} - -func (c *Cassandra) getAttr(requestURL *url.URL) (map[string]interface{}, error) { - // Create + send request - req, err := http.NewRequest("GET", requestURL.String(), nil) - if err != nil { - return nil, err - } - - resp, err := c.jClient.MakeRequest(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // Process response - if resp.StatusCode != http.StatusOK { - err = fmt.Errorf("response from url %q has status code %d (%s), expected %d (%s)", - requestURL, - resp.StatusCode, - http.StatusText(resp.StatusCode), - http.StatusOK, - http.StatusText(http.StatusOK)) - return nil, err - } - - // read body - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - // Unmarshal json - var jsonOut map[string]interface{} - if err = json.Unmarshal(body, &jsonOut); err != nil { - return nil, errors.New("error decoding JSON response") - } - - return jsonOut, nil -} - -func parseServerTokens(server string) map[string]string { - serverTokens := make(map[string]string) - - hostAndUser := strings.Split(server, "@") - hostPort := "" - userPasswd := "" - if len(hostAndUser) == 2 { - hostPort = hostAndUser[1] - userPasswd = hostAndUser[0] - } else { - hostPort = hostAndUser[0] - } - hostTokens := strings.Split(hostPort, ":") - serverTokens["host"] = hostTokens[0] - serverTokens["port"] = hostTokens[1] - - if userPasswd != "" { - userTokens := strings.Split(userPasswd, ":") - serverTokens["user"] = userTokens[0] - serverTokens["passwd"] = userTokens[1] - } - return serverTokens -} - -func (*Cassandra) SampleConfig() string { - return sampleConfig -} - -func (c *Cassandra) Start(_ telegraf.Accumulator) error { - c.Log.Warn("DEPRECATED: The cassandra plugin has been deprecated. " + - "Please use the jolokia2 plugin instead. " + - "https://github.com/influxdata/telegraf/tree/master/plugins/inputs/jolokia2") - return nil -} - -func (c *Cassandra) Stop() { -} - -func (c *Cassandra) Gather(acc telegraf.Accumulator) error { - context := c.Context - servers := c.Servers - metrics := c.Metrics - - for _, server := range servers { - for _, metric := range metrics { - serverTokens := parseServerTokens(server) - - var m jmxMetric - if strings.HasPrefix(metric, "/java.lang:") { - m = newJavaMetric(acc, serverTokens["host"], metric) - } else if strings.HasPrefix(metric, - "/org.apache.cassandra.metrics:") { - m = newCassandraMetric(acc, serverTokens["host"], metric) - } else { - // unsupported metric type - acc.AddError(fmt.Errorf("unsupported Cassandra metric [%s], skipping", metric)) - continue - } - - // Prepare URL - requestURL, err := url.Parse("http://" + serverTokens["host"] + ":" + - serverTokens["port"] + context + metric) - if err != nil { - acc.AddError(err) - continue - } - if serverTokens["user"] != "" && serverTokens["passwd"] != "" { - requestURL.User = url.UserPassword(serverTokens["user"], - serverTokens["passwd"]) - } - - out, err := c.getAttr(requestURL) - if err != nil { - acc.AddError(err) - continue - } - if out["status"] != 200.0 { - acc.AddError(fmt.Errorf("provided URL returned with status %v - %s", out["status"], requestURL)) - continue - } - m.addTagsFields(out) - } - } - return nil -} - -func init() { - inputs.Add("cassandra", func() telegraf.Input { - return &Cassandra{jClient: &JolokiaClientImpl{client: &http.Client{}}} - }) -} diff --git a/plugins/inputs/cassandra/cassandra_test.go b/plugins/inputs/cassandra/cassandra_test.go deleted file mode 100644 index 78e9cfdda..000000000 --- a/plugins/inputs/cassandra/cassandra_test.go +++ /dev/null @@ -1,271 +0,0 @@ -package cassandra - -import ( - "io" - "net/http" - "strings" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/influxdata/telegraf/testutil" -) - -const validJavaMultiValueJSON = ` -{ - "request":{ - "mbean":"java.lang:type=Memory", - "attribute":"HeapMemoryUsage", - "type":"read" - }, - "value":{ - "init":67108864, - "committed":456130560, - "max":477626368, - "used":203288528 - }, - "timestamp":1446129191, - "status":200 -}` - -const validCassandraMultiValueJSON = ` -{ - "request": { - "mbean": "org.apache.cassandra.metrics:keyspace=test_keyspace1,name=ReadLatency,scope=test_table,type=Table", - "type": "read"}, - "status": 200, - "timestamp": 1458089229, - "value": { - "999thPercentile": 20.0, - "99thPercentile": 10.0, - "Count": 400, - "DurationUnit": "microseconds", - "Max": 30.0, - "Mean": null, - "MeanRate": 3.0, - "Min": 1.0, - "RateUnit": "events/second", - "StdDev": null - } -}` - -const validCassandraNestedMultiValueJSON = ` -{ - "request": { - "mbean": "org.apache.cassandra.metrics:keyspace=test_keyspace1,name=ReadLatency,scope=*,type=Table", - "type": "read"}, - "status": 200, - "timestamp": 1458089184, - "value": { - "org.apache.cassandra.metrics:keyspace=test_keyspace1,name=ReadLatency,scope=test_table1,type=Table": - { "999thPercentile": 1.0, - "Count": 100, - "DurationUnit": "microseconds", - "OneMinuteRate": 1.0, - "RateUnit": "events/second", - "StdDev": null - }, - "org.apache.cassandra.metrics:keyspace=test_keyspace2,name=ReadLatency,scope=test_table2,type=Table": - { "999thPercentile": 2.0, - "Count": 200, - "DurationUnit": "microseconds", - "OneMinuteRate": 2.0, - "RateUnit": "events/second", - "StdDev": null - } - } -}` - -const validJavaMultiTypeJSON = ` -{ - "request":{ - "mbean":"java.lang:name=ConcurrentMarkSweep,type=GarbageCollector", - "attribute":"CollectionCount", - "type":"read" - }, - "value":1, - "timestamp":1459316570, - "status":200 -}` - -const invalidJSON = "I don't think this is JSON" - -var Servers = []string{"10.10.10.10:8778"} -var AuthServers = []string{"user:passwd@10.10.10.10:8778"} -var MultipleServers = []string{"10.10.10.10:8778", "10.10.10.11:8778"} -var HeapMetric = "/java.lang:type=Memory/HeapMemoryUsage" -var ReadLatencyMetric = "/org.apache.cassandra.metrics:type=Table,keyspace=test_keyspace1,scope=test_table,name=ReadLatency" -var NestedReadLatencyMetric = "/org.apache.cassandra.metrics:type=Table,keyspace=test_keyspace1,scope=*,name=ReadLatency" -var GarbageCollectorMetric1 = "/java.lang:type=GarbageCollector,name=ConcurrentMarkSweep/CollectionCount" -var GarbageCollectorMetric2 = "/java.lang:type=GarbageCollector,name=ConcurrentMarkSweep/CollectionTime" -var Context = "/jolokia/read" - -type jolokiaClientStub struct { - responseBody string - statusCode int -} - -func (c jolokiaClientStub) MakeRequest(_ *http.Request) (*http.Response, error) { - resp := http.Response{} - resp.StatusCode = c.statusCode - resp.Body = io.NopCloser(strings.NewReader(c.responseBody)) - return &resp, nil -} - -// Generates a pointer to an HttpJson object that uses a mock HTTP client. -// Parameters: -// -// response : Body of the response that the mock HTTP client should return -// statusCode: HTTP status code the mock HTTP client should return -// -// Returns: -// -// *HttpJson: Pointer to an HttpJson object that uses the generated mock HTTP client -func genJolokiaClientStub(response string, statusCode int, servers []string, metrics []string) *Cassandra { - return &Cassandra{ - jClient: jolokiaClientStub{responseBody: response, statusCode: statusCode}, - Context: Context, - Servers: servers, - Metrics: metrics, - } -} - -// Test that the proper values are ignored or collected for class=Java -func TestHttpJsonJavaMultiValue(t *testing.T) { - cassandra := genJolokiaClientStub(validJavaMultiValueJSON, 200, - MultipleServers, []string{HeapMetric}) - - var acc testutil.Accumulator - acc.SetDebug(true) - err := acc.GatherError(cassandra.Gather) - - require.NoError(t, err) - require.Len(t, acc.Metrics, 2) - - fields := map[string]interface{}{ - "HeapMemoryUsage_init": 67108864.0, - "HeapMemoryUsage_committed": 456130560.0, - "HeapMemoryUsage_max": 477626368.0, - "HeapMemoryUsage_used": 203288528.0, - } - tags1 := map[string]string{ - "cassandra_host": "10.10.10.10", - "mname": "HeapMemoryUsage", - } - - tags2 := map[string]string{ - "cassandra_host": "10.10.10.11", - "mname": "HeapMemoryUsage", - } - acc.AssertContainsTaggedFields(t, "javaMemory", fields, tags1) - acc.AssertContainsTaggedFields(t, "javaMemory", fields, tags2) -} - -func TestHttpJsonJavaMultiType(t *testing.T) { - cassandra := genJolokiaClientStub(validJavaMultiTypeJSON, 200, AuthServers, []string{GarbageCollectorMetric1, GarbageCollectorMetric2}) - - var acc testutil.Accumulator - acc.SetDebug(true) - err := acc.GatherError(cassandra.Gather) - - require.NoError(t, err) - require.Len(t, acc.Metrics, 2) - - fields := map[string]interface{}{ - "CollectionCount": 1.0, - } - - tags := map[string]string{ - "cassandra_host": "10.10.10.10", - "mname": "ConcurrentMarkSweep", - } - acc.AssertContainsTaggedFields(t, "javaGarbageCollector", fields, tags) -} - -// Test that the proper values are ignored or collected -func TestHttp404(t *testing.T) { - jolokia := genJolokiaClientStub(invalidJSON, 404, Servers, []string{HeapMetric}) - - var acc testutil.Accumulator - err := acc.GatherError(jolokia.Gather) - - require.Error(t, err) - require.Empty(t, acc.Metrics) - require.Contains(t, err.Error(), "has status code 404") -} - -// Test that the proper values are ignored or collected for class=Cassandra -func TestHttpJsonCassandraMultiValue(t *testing.T) { - cassandra := genJolokiaClientStub(validCassandraMultiValueJSON, 200, Servers, []string{ReadLatencyMetric}) - - var acc testutil.Accumulator - err := acc.GatherError(cassandra.Gather) - - require.NoError(t, err) - require.Len(t, acc.Metrics, 1) - - fields := map[string]interface{}{ - "ReadLatency_999thPercentile": 20.0, - "ReadLatency_99thPercentile": 10.0, - "ReadLatency_Count": 400.0, - "ReadLatency_DurationUnit": "microseconds", - "ReadLatency_Max": 30.0, - "ReadLatency_MeanRate": 3.0, - "ReadLatency_Min": 1.0, - "ReadLatency_RateUnit": "events/second", - } - - tags := map[string]string{ - "cassandra_host": "10.10.10.10", - "mname": "ReadLatency", - "keyspace": "test_keyspace1", - "scope": "test_table", - } - acc.AssertContainsTaggedFields(t, "cassandraTable", fields, tags) -} - -// Test that the proper values are ignored or collected for class=Cassandra with -// nested values -func TestHttpJsonCassandraNestedMultiValue(t *testing.T) { - cassandra := genJolokiaClientStub(validCassandraNestedMultiValueJSON, 200, Servers, []string{NestedReadLatencyMetric}) - - var acc testutil.Accumulator - acc.SetDebug(true) - err := acc.GatherError(cassandra.Gather) - - require.NoError(t, err) - require.Len(t, acc.Metrics, 2) - - fields1 := map[string]interface{}{ - "ReadLatency_999thPercentile": 1.0, - "ReadLatency_Count": 100.0, - "ReadLatency_DurationUnit": "microseconds", - "ReadLatency_OneMinuteRate": 1.0, - "ReadLatency_RateUnit": "events/second", - } - - fields2 := map[string]interface{}{ - "ReadLatency_999thPercentile": 2.0, - "ReadLatency_Count": 200.0, - "ReadLatency_DurationUnit": "microseconds", - "ReadLatency_OneMinuteRate": 2.0, - "ReadLatency_RateUnit": "events/second", - } - - tags1 := map[string]string{ - "cassandra_host": "10.10.10.10", - "mname": "ReadLatency", - "keyspace": "test_keyspace1", - "scope": "test_table1", - } - - tags2 := map[string]string{ - "cassandra_host": "10.10.10.10", - "mname": "ReadLatency", - "keyspace": "test_keyspace2", - "scope": "test_table2", - } - - acc.AssertContainsTaggedFields(t, "cassandraTable", fields1, tags1) - acc.AssertContainsTaggedFields(t, "cassandraTable", fields2, tags2) -} diff --git a/plugins/inputs/cassandra/sample.conf b/plugins/inputs/cassandra/sample.conf deleted file mode 100644 index d69175df1..000000000 --- a/plugins/inputs/cassandra/sample.conf +++ /dev/null @@ -1,15 +0,0 @@ -# Read Cassandra metrics through Jolokia -[[inputs.cassandra]] - context = "/jolokia/read" - ## List of cassandra servers exposing jolokia read service - servers = ["myuser:mypassword@10.10.10.1:8778","10.10.10.2:8778",":8778"] - ## List of metrics collected on above servers - ## Each metric consists of a jmx path. - ## This will collect all heap memory usage metrics from the jvm and - ## ReadLatency metrics for all keyspaces and tables. - ## "type=Table" in the query works with Cassandra3.0. Older versions might - ## need to use "type=ColumnFamily" - metrics = [ - "/java.lang:type=Memory/HeapMemoryUsage", - "/org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=ReadLatency" - ]