1
0
Fork 0
telegraf/plugins/inputs/ravendb/ravendb_test.go

412 lines
17 KiB
Go
Raw Permalink Normal View History

package ravendb
import (
"net/http"
"net/http/httptest"
"os"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/testutil"
)
// Test against fully filled data
func TestRavenDBGeneratesMetricsFull(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var jsonFilePath string
switch r.URL.Path {
case "/admin/monitoring/v1/databases":
jsonFilePath = "testdata/databases_full.json"
case "/admin/monitoring/v1/server":
jsonFilePath = "testdata/server_full.json"
case "/admin/monitoring/v1/indexes":
jsonFilePath = "testdata/indexes_full.json"
case "/admin/monitoring/v1/collections":
jsonFilePath = "testdata/collections_full.json"
default:
w.WriteHeader(http.StatusInternalServerError)
t.Errorf("Cannot handle request for uri %s", r.URL.Path)
return
}
data, err := os.ReadFile(jsonFilePath)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Errorf("Could not read from data file %q: %v", jsonFilePath, err)
return
}
if _, err = w.Write(data); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
}))
defer ts.Close()
r := &RavenDB{
URL: ts.URL,
StatsInclude: []string{"server", "databases", "indexes", "collections"},
Log: testutil.Logger{},
}
require.NoError(t, r.Init())
acc := &testutil.Accumulator{}
err := acc.GatherError(r.Gather)
require.NoError(t, err)
serverFields := map[string]interface{}{
"server_version": "5.1",
"server_full_version": "5.1.1-custom-51",
"uptime_in_sec": int64(30),
"server_process_id": 26360,
"config_server_urls": "http://127.0.0.1:8080;http://192.168.0.1:8080",
"config_tcp_server_urls": "tcp://127.0.0.1:3888;tcp://192.168.0.1:3888",
"config_public_tcp_server_urls": "tcp://2.3.4.5:3888;tcp://6.7.8.9:3888",
"backup_max_number_of_concurrent_backups": 4,
"backup_current_number_of_running_backups": 2,
"cpu_process_usage": 6.28,
"cpu_machine_usage": 41.05,
"cpu_machine_io_wait": 2.55,
"cpu_processor_count": 8,
"cpu_assigned_processor_count": 7,
"cpu_thread_pool_available_worker_threads": 32766,
"cpu_thread_pool_available_completion_port_threads": 1000,
"memory_allocated_in_mb": 235,
"memory_installed_in_mb": 16384,
"memory_physical_in_mb": 16250,
"memory_low_memory_severity": "None",
"memory_total_swap_size_in_mb": 1024,
"memory_total_swap_usage_in_mb": 456,
"memory_working_set_swap_usage_in_mb": 89,
"memory_total_dirty_in_mb": 1,
"disk_system_store_used_data_file_size_in_mb": 28,
"disk_system_store_total_data_file_size_in_mb": 32,
"disk_total_free_space_in_mb": 52078,
"disk_remaining_storage_space_percentage": 22,
"license_type": "Enterprise",
"license_expiration_left_in_sec": 25466947.5,
"license_utilized_cpu_cores": 8,
"license_max_cores": 256,
"network_tcp_active_connections": 84,
"network_concurrent_requests_count": 1,
"network_total_requests": 3,
"network_requests_per_sec": 0.03322,
"network_last_request_time_in_sec": 0.0264977,
"network_last_authorized_non_cluster_admin_request_time_in_sec": 0.04,
"certificate_server_certificate_expiration_left_in_sec": float64(104),
"certificate_well_known_admin_certificates": "a909502dd82ae41433e6f83886b00d4277a32a7b;4444444444444444444444444444444444444444",
"cluster_node_state": "Leader",
"cluster_current_term": 28,
"cluster_index": 104,
"databases_total_count": 25,
"databases_loaded_count": 2,
}
serverTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"cluster_id": "6b535a18-558f-4e53-a479-a514efc16aab",
"public_server_url": "http://raven1:8080",
}
defaultTime := time.Unix(0, 0)
dbFields := map[string]interface{}{
"uptime_in_sec": float64(1396),
"time_since_last_backup_in_sec": 104.3,
"counts_documents": 425189,
"counts_revisions": 429605,
"counts_attachments": 17,
"counts_unique_attachments": 16,
"counts_alerts": 2,
"counts_rehabs": 3,
"counts_performance_hints": 5,
"counts_replication_factor": 2,
"statistics_doc_puts_per_sec": 23.4,
"statistics_map_index_indexes_per_sec": 82.5,
"statistics_map_reduce_index_mapped_per_sec": 50.3,
"statistics_map_reduce_index_reduced_per_sec": 85.2,
"statistics_requests_per_sec": 22.5,
"statistics_requests_count": 809,
"statistics_request_average_duration_in_ms": 0.55,
"indexes_count": 7,
"indexes_stale_count": 1,
"indexes_errors_count": 2,
"indexes_static_count": 7,
"indexes_auto_count": 3,
"indexes_idle_count": 4,
"indexes_disabled_count": 5,
"indexes_errored_count": 6,
"storage_documents_allocated_data_file_in_mb": 1024,
"storage_documents_used_data_file_in_mb": 942,
"storage_indexes_allocated_data_file_in_mb": 464,
"storage_indexes_used_data_file_in_mb": 278,
"storage_total_allocated_storage_file_in_mb": 1496,
"storage_total_free_space_in_mb": 52074,
"storage_io_read_operations": 0.5,
"storage_io_write_operations": 0.7,
"storage_read_throughput_in_kb": 2137,
"storage_write_throughput_in_kb": 2115,
"storage_queue_length": 15,
}
dbTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"database_name": "db2",
"database_id": "06eefe8b-d720-4a8d-a809-2c5af9a4abb5",
"public_server_url": "http://myhost:8080",
}
indexFields := map[string]interface{}{
"priority": "Normal",
"state": "Normal",
"errors": 0,
"time_since_last_query_in_sec": 3.4712567,
"time_since_last_indexing_in_sec": 3.4642612,
"lock_mode": "Unlock",
"is_invalid": true,
"status": "Running",
"mapped_per_sec": 102.34,
"reduced_per_sec": 593.23,
"type": "MapReduce",
}
indexTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"public_server_url": "http://localhost:8080",
"database_name": "db1",
"index_name": "Product/Rating",
}
collectionFields := map[string]interface{}{
"documents_count": 830,
"total_size_in_bytes": 2744320,
"documents_size_in_bytes": 868352,
"tombstones_size_in_bytes": 122880,
"revisions_size_in_bytes": 1753088,
}
collectionTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"database_name": "db1",
"collection_name": "Orders",
"public_server_url": "http://localhost:8080",
}
serverExpected := testutil.MustMetric("ravendb_server", serverTags, serverFields, defaultTime)
dbExpected := testutil.MustMetric("ravendb_databases", dbTags, dbFields, defaultTime)
indexExpected := testutil.MustMetric("ravendb_indexes", indexTags, indexFields, defaultTime)
collectionsExpected := testutil.MustMetric("ravendb_collections", collectionTags, collectionFields, defaultTime)
for _, metric := range acc.GetTelegrafMetrics() {
switch metric.Name() {
case "ravendb_server":
testutil.RequireMetricEqual(t, serverExpected, metric, testutil.IgnoreTime())
case "ravendb_databases":
testutil.RequireMetricEqual(t, dbExpected, metric, testutil.IgnoreTime())
case "ravendb_indexes":
testutil.RequireMetricEqual(t, indexExpected, metric, testutil.IgnoreTime())
case "ravendb_collections":
testutil.RequireMetricEqual(t, collectionsExpected, metric, testutil.IgnoreTime())
}
}
}
// Test against minimum filled data
func TestRavenDBGeneratesMetricsMin(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var jsonFilePath string
switch r.URL.Path {
case "/admin/monitoring/v1/databases":
jsonFilePath = "testdata/databases_min.json"
case "/admin/monitoring/v1/server":
jsonFilePath = "testdata/server_min.json"
case "/admin/monitoring/v1/indexes":
jsonFilePath = "testdata/indexes_min.json"
case "/admin/monitoring/v1/collections":
jsonFilePath = "testdata/collections_min.json"
default:
w.WriteHeader(http.StatusInternalServerError)
t.Errorf("Cannot handle request for uri %s", r.URL.Path)
return
}
data, err := os.ReadFile(jsonFilePath)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Errorf("Could not read from data file %q: %v", jsonFilePath, err)
return
}
if _, err = w.Write(data); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
}))
defer ts.Close()
r := &RavenDB{
URL: ts.URL,
StatsInclude: []string{"server", "databases", "indexes", "collections"},
Log: testutil.Logger{},
}
require.NoError(t, r.Init())
acc := &testutil.Accumulator{}
err := acc.GatherError(r.Gather)
require.NoError(t, err)
serverFields := map[string]interface{}{
"server_version": "5.1",
"server_full_version": "5.1.1-custom-51",
"uptime_in_sec": 30,
"server_process_id": 26360,
"config_server_urls": "http://127.0.0.1:8080",
"backup_max_number_of_concurrent_backups": 4,
"backup_current_number_of_running_backups": 2,
"cpu_process_usage": 6.28,
"cpu_machine_usage": 41.07,
"cpu_processor_count": 8,
"cpu_assigned_processor_count": 7,
"cpu_thread_pool_available_worker_threads": 32766,
"cpu_thread_pool_available_completion_port_threads": 1000,
"memory_allocated_in_mb": 235,
"memory_installed_in_mb": 16384,
"memory_physical_in_mb": 16250,
"memory_low_memory_severity": "Low",
"memory_total_swap_size_in_mb": 1024,
"memory_total_swap_usage_in_mb": 456,
"memory_working_set_swap_usage_in_mb": 89,
"memory_total_dirty_in_mb": 1,
"disk_system_store_used_data_file_size_in_mb": 28,
"disk_system_store_total_data_file_size_in_mb": 32,
"disk_total_free_space_in_mb": 52078,
"disk_remaining_storage_space_percentage": 22,
"license_type": "Enterprise",
"license_utilized_cpu_cores": 8,
"license_max_cores": 256,
"network_tcp_active_connections": 84,
"network_concurrent_requests_count": 1,
"network_total_requests": 3,
"network_requests_per_sec": 0.03322,
"cluster_node_state": "Leader",
"cluster_current_term": 28,
"cluster_index": 104,
"databases_total_count": 25,
"databases_loaded_count": 2,
}
serverTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"cluster_id": "6b535a18-558f-4e53-a479-a514efc16aab",
}
dbFields := map[string]interface{}{
"uptime_in_sec": float64(1396),
"counts_documents": 425189,
"counts_revisions": 429605,
"counts_attachments": 17,
"counts_unique_attachments": 16,
"counts_alerts": 2,
"counts_rehabs": 3,
"counts_performance_hints": 5,
"counts_replication_factor": 2,
"statistics_doc_puts_per_sec": 23.4,
"statistics_map_index_indexes_per_sec": 82.5,
"statistics_map_reduce_index_mapped_per_sec": 50.3,
"statistics_map_reduce_index_reduced_per_sec": 85.2,
"statistics_requests_per_sec": 22.5,
"statistics_requests_count": 809,
"statistics_request_average_duration_in_ms": 0.55,
"indexes_count": 7,
"indexes_stale_count": 1,
"indexes_errors_count": 2,
"indexes_static_count": 7,
"indexes_auto_count": 3,
"indexes_idle_count": 4,
"indexes_disabled_count": 5,
"indexes_errored_count": 6,
"storage_documents_allocated_data_file_in_mb": 1024,
"storage_documents_used_data_file_in_mb": 942,
"storage_indexes_allocated_data_file_in_mb": 464,
"storage_indexes_used_data_file_in_mb": 278,
"storage_total_allocated_storage_file_in_mb": 1496,
"storage_total_free_space_in_mb": 52074,
}
dbTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"database_name": "db2",
"database_id": "06eefe8b-d720-4a8d-a809-2c5af9a4abb5",
}
indexFields := map[string]interface{}{
"priority": "Normal",
"state": "Normal",
"errors": 0,
"lock_mode": "Unlock",
"is_invalid": false,
"status": "Running",
"mapped_per_sec": 102.34,
"reduced_per_sec": 593.23,
"type": "MapReduce",
}
indexTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"database_name": "db1",
"index_name": "Product/Rating",
}
collectionFields := map[string]interface{}{
"documents_count": 830,
"total_size_in_bytes": 2744320,
"documents_size_in_bytes": 868352,
"tombstones_size_in_bytes": 122880,
"revisions_size_in_bytes": 1753088,
}
collectionTags := map[string]string{
"url": ts.URL,
"node_tag": "A",
"database_name": "db1",
"collection_name": "Orders",
}
defaultTime := time.Unix(0, 0)
serverExpected := testutil.MustMetric("ravendb_server", serverTags, serverFields, defaultTime)
dbExpected := testutil.MustMetric("ravendb_databases", dbTags, dbFields, defaultTime)
indexExpected := testutil.MustMetric("ravendb_indexes", indexTags, indexFields, defaultTime)
collectionsExpected := testutil.MustMetric("ravendb_collections", collectionTags, collectionFields, defaultTime)
for _, metric := range acc.GetTelegrafMetrics() {
switch metric.Name() {
case "ravendb_server":
testutil.RequireMetricEqual(t, serverExpected, metric, testutil.IgnoreTime())
case "ravendb_databases":
testutil.RequireMetricEqual(t, dbExpected, metric, testutil.IgnoreTime())
case "ravendb_indexes":
testutil.RequireMetricEqual(t, indexExpected, metric, testutil.IgnoreTime())
case "ravendb_collections":
testutil.RequireMetricEqual(t, collectionsExpected, metric, testutil.IgnoreTime())
}
}
}