solarwinds_apm 5.1.2 → 5.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -0
  3. data/CHANGELOG.md +14 -0
  4. data/README.md +4 -2
  5. data/ext/oboe_metal/extconf.rb +18 -5
  6. data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.0.0.0.sha256 +1 -0
  7. data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.0.0.0.sha256 +1 -0
  8. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256 +1 -1
  9. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256 +1 -1
  10. data/ext/oboe_metal/src/VERSION +1 -1
  11. data/ext/oboe_metal/src/oboe.h +2 -4
  12. data/ext/oboe_metal/src/oboe_api.cpp +7 -12
  13. data/ext/oboe_metal/src/oboe_api.h +1 -3
  14. data/ext/oboe_metal/src/oboe_swig_wrap.cc +3 -19
  15. data/lib/oboe_metal.rb +9 -0
  16. data/lib/solarwinds_apm/cert/star.appoptics.com.issuer.crt +24 -0
  17. data/lib/solarwinds_apm/inst/redis.rb +36 -29
  18. data/lib/solarwinds_apm/inst/redis_v4.rb +273 -0
  19. data/lib/solarwinds_apm/oboe_init_options.rb +23 -6
  20. data/lib/solarwinds_apm/util.rb +116 -42
  21. data/lib/solarwinds_apm/version.rb +1 -1
  22. data/solarwinds_apm.gemspec +5 -2
  23. metadata +6 -12
  24. data/.github/CODEOWNERS +0 -1
  25. data/.github/ISSUE_TEMPLATE/bug-or-feature-request.md +0 -16
  26. data/.github/workflows/build_and_release_gem.yml +0 -108
  27. data/.github/workflows/build_for_packagecloud.yml +0 -59
  28. data/.github/workflows/docker-images.yml +0 -53
  29. data/.github/workflows/run_cpluplus_tests.yml +0 -73
  30. data/.github/workflows/run_tests.yml +0 -154
  31. data/.github/workflows/scripts/test_install.rb +0 -28
  32. data/.github/workflows/swig/swig-v4.0.2.tar.gz +0 -0
  33. data/.github/workflows/test_on_4_linux.yml +0 -161
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a62089a2d5a8a8728332f7e5b98c8d11c9f84523ec187b0420c84f9dc5951191
4
- data.tar.gz: d5aedff305013aea008f886362907ffd6ed1f36f73d8a2dc9ee5d08968b80d9e
3
+ metadata.gz: 6b56699604e8448a606d69ed23ba957622c4b70d8d2cbcf070526105f2dcff87
4
+ data.tar.gz: 5b0f55643f2ea9072418c66c62a6f9ea4ca87fea74fbcec66574a341e0510c82
5
5
  SHA512:
6
- metadata.gz: b9d8c4dc8e9847308f68d747b7262da560b0bff4d1653bf92856bc2599a2f600291daeaeb28f7e9c96ede12a408117b434b4bb8cefd9eeb0f6a7f5ec6838eb6b
7
- data.tar.gz: 5a1f702b33e82fbc0464f7aed84411d55d5a1eaab38b47fc6f83dbf639673180698ec971e18b8cf9d3811a1b0441b09a53686103315b23c540df902fbcf67d76
6
+ metadata.gz: f77f2c0e8315832f92204bc0cdd29d6588f83cbf2751f8dfac2fb0402c65091c96238f0192da4473b99a0cf5197b44a66839f7d1c58fb5521bd11ce1a96defc6
7
+ data.tar.gz: 53c8e3740a5361fa4f9e403cf863f2044d821a58a7c42ac8708c859781c363b168af78e39da50b2ceeda783b752205cf0c0cb5bdf86afa7ffa4e63e80ae4dffe
data/.gitignore CHANGED
@@ -41,3 +41,18 @@ gemfiles/vendor*
41
41
  lib/libsolarwinds_apm.so
42
42
  vendor/
43
43
 
44
+ # test & test script
45
+ tmp.rb
46
+ apm.collector.st-ssp.solarwinds.com
47
+ test/run_tests/.ruby_version_ubuntu
48
+ test/run_tests/.ruby_version_alpine
49
+ test/run_tests/.ruby_version_centos
50
+ test/run_tests/.ruby_version_ubuntu
51
+
52
+ redis-test.*
53
+
54
+ # compiling
55
+ ext/oboe_metal/verify
56
+
57
+ # mac DS_Store
58
+ .DS_Store
data/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@ https://github.com/solarwindscloud/solarwinds-apm-ruby/releases
3
3
 
4
4
  Dates in this file are in the format MM/DD/YYYY.
5
5
 
6
+ # solarwinds_apm 5.1.4 (11/23/2022)
7
+
8
+ This release includes the following features:
9
+
10
+ * Update to the latest redis-rb gem (> 5.x)
11
+ * Update latest liboboe library (11.1.0)
12
+ * Start to support solarwinds-apm-ruby arm64/aarch64
13
+ * Init message update for swo/nh backends
14
+
15
+ Pushed to Rubygems:
16
+
17
+ https://rubygems.org/gems/solarwinds_apm/versions/5.1.4
18
+
19
+
6
20
  # solarwinds_apm 5.1.0 (09/15/2022)
7
21
 
8
22
  This release includes the following features:
data/README.md CHANGED
@@ -11,7 +11,8 @@ It requires an [Solarwinds] account to view metrics. Get yours,
11
11
 
12
12
  [![Gem Version](https://badge.fury.io/rb/solarwinds_apm.svg)](https://badge.fury.io/rb/solarwinds_apm)
13
13
 
14
- [![Run all Tests](https://github.com/appoptics/appoptics-apm-ruby/actions/workflows/run_tests.yml/badge.svg)](https://github.com/appoptics/appoptics-apm-ruby/actions/workflows/run_tests.yml)
14
+ [![Run all Tests](https://github.com/solarwindscloud/solarwinds-apm-ruby/actions/workflows/test_on_4_linux.yml/badge.svg)](https://github.com/solarwindscloud/solarwinds-apm-ruby/actions/workflows/test_on_4_linux.yml)
15
+
15
16
  [![C++ Tests](https://github.com/appoptics/appoptics-apm-ruby/actions/workflows/run_cpluplus_tests.yml/badge.svg)](https://github.com/appoptics/appoptics-apm-ruby/actions/workflows/run_cpluplus_tests.yml)
16
17
 
17
18
  [comment]: <> ([![Maintainability]&#40;https://api.codeclimate.com/v1/badges/ac7f36241a23a3a82fc5/maintainability&#41;]&#40;https://codeclimate.com/github/appoptics/appoptics-apm-ruby/maintainability&#41;)
@@ -363,7 +364,7 @@ To make this simpler, we've included a few rake tasks to automate this process:
363
364
 
364
365
  ```bash
365
366
  rake clean # make sure no old stuff is around
366
- rake fetch_oboe_file_from_staging # download c-files from staging
367
+ rake fetch_oboe_file["stg"] # download c-files from staging
367
368
  rake compile # Build the gem's c extension
368
369
  ```
369
370
 
@@ -381,3 +382,4 @@ See the README in the test directory.
381
382
  Copyright (c) 2018 SolarWinds, LLC
382
383
 
383
384
  Released under the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)
385
+
@@ -27,26 +27,39 @@ ao_include = File.join(ext_dir, 'src')
27
27
 
28
28
  # Download the appropriate liboboe from Staging or Production
29
29
  version = File.read(File.join(ao_include, 'VERSION')).strip
30
- if ENV['OBOE_STAGING'].to_s.downcase == 'true'
30
+ if ENV['OBOE_DEV'].to_s.downcase == 'true'
31
+ ao_path = "https://solarwinds-apm-staging.s3.us-west-2.amazonaws.com/apm/c-lib/nightly"
32
+ puts 'Fetching c-lib from DEVELOPMENT Build'
33
+ elsif ENV['OBOE_STAGING'].to_s.downcase == 'true'
31
34
  ao_path = File.join('https://agent-binaries.global.st-ssp.solarwinds.com/apm/c-lib/', version)
32
35
  puts 'Fetching c-lib from STAGING'
33
36
  else
34
37
  ao_path = File.join('https://agent-binaries.cloud.solarwinds.com/apm/c-lib/', version)
35
38
  end
36
39
 
37
- ao_arch = 'x86_64'
40
+ ao_arch = "x86_64"
41
+ system_arch = `uname -m` # for mac, the command is `uname` # "Darwin\n"; try `uname -a`
42
+ case system_arch.gsub("\n","")
43
+ when "x86_64"
44
+ ao_arch = "x86_64"
45
+ when "aarch64"
46
+ ao_arch = "aarch64"
47
+ end
48
+
38
49
  if File.exist?('/etc/alpine-release')
39
50
  version = File.read('/etc/alpine-release').strip
40
51
 
52
+ tmp_ao_arch = ao_arch.clone
41
53
  ao_arch =
42
54
  if Gem::Version.new(version) < Gem::Version.new('3.9')
43
- 'alpine-libressl-x86_64'
55
+ "alpine-libressl-#{tmp_ao_arch}"
44
56
  else # openssl
45
- 'alpine-x86_64'
57
+ "alpine-#{tmp_ao_arch}"
46
58
  end
47
59
  end
48
60
 
49
61
  ao_clib = "liboboe-1.0-#{ao_arch}.so.0.0.0"
62
+ ao_clib = "liboboe-1.0-#{ao_arch}.so" if ENV['OBOE_DEV'].to_s.downcase == 'true' # for dev build only
50
63
  ao_item = File.join(ao_path, ao_clib)
51
64
  ao_checksum_file = File.join(ao_lib_dir, "#{ao_clib}.sha256")
52
65
  clib = File.join(ao_lib_dir, ao_clib)
@@ -138,4 +151,4 @@ if success
138
151
  $stderr.puts '=================================================================='
139
152
  create_makefile('oboe_noop', 'noop')
140
153
  end
141
- end
154
+ end
@@ -0,0 +1 @@
1
+ ae491260c3b2dfbb2ada97de0c94e78424b2eb5bf19b2b752c25301057270c30
@@ -0,0 +1 @@
1
+ a1f5406931ce82b0297bbb1b2b22b151c544e47babc43f0116274f95002ce85e
@@ -1 +1 @@
1
- e1a52a84efc7019c06af710313235a7063f2f73e00ae66e3a4cae9e86f6f03cb
1
+ ede3fcc827faba4d6cf09d2dd59a41325c462c9093994c2c2df202ae57416733
@@ -1 +1 @@
1
- 662fccb7d38fbc159cdd31a9fc1b7066e6c9c799dda524b1db5508cdab20274b
1
+ 079abfef35a869c3469908a62b97ad6f0f98f85a6f79e3c60265b251dc07dac3
@@ -1,2 +1,2 @@
1
- 10.6.1
1
+ 11.1.0
2
2
 
@@ -169,7 +169,7 @@ typedef struct oboe_metric_tag {
169
169
  } oboe_metric_tag_t;
170
170
 
171
171
  typedef struct oboe_init_options {
172
- int version; // the version of this structure (currently on version 14)
172
+ int version; // the version of this structure (currently on version 15)
173
173
  const char *hostname_alias; // optional hostname alias
174
174
  int log_level; // level at which log messages will be written to log file (0-6)
175
175
  // use LOGLEVEL_DEFAULT for default log level
@@ -182,7 +182,7 @@ typedef struct oboe_init_options {
182
182
  const char *reporter; // the reporter to be used (ssl, upd, file, null, lambda)
183
183
  const char *host; // collector endpoint (reporter=ssl), udp address (reporter=udp), or file path (reporter=file)
184
184
  const char *service_key; // the service key
185
- const char *trusted_path; // path to the SSL certificate (only for ssl)
185
+ const char *certificates; // content of SSL certificates, passed to gRPC::SslCredentialsOptions() for collector connection verification
186
186
  int buffer_size; // size of the message buffer
187
187
  int trace_metrics; // flag indicating if trace metrics reporting should be enabled (default) or disabled
188
188
  int histogram_precision; // the histogram precision (only for ssl)
@@ -194,8 +194,6 @@ typedef struct oboe_init_options {
194
194
  const char *proxy; // HTTP proxy address and port to be used for the gRPC connection
195
195
  int stdout_clear_nonblocking; // flag indicating if the O_NONBLOCK flag on stdout should be cleared,
196
196
  // only used in lambda reporter (off=0, on=1, default off)
197
- int is_grpc_clean_hack_enabled; // flag indicating if custom grpc clean hack enabled (default 0)
198
- int mode; // depreciated; value is ignored
199
197
  int metric_format; // flag indicating the format of metric (0 = Both; 1 = TransactionResponseTime only; 2 = ResponseTime only; default = 0)
200
198
  } oboe_init_options_t;
201
199
 
@@ -7,7 +7,7 @@
7
7
  **/
8
8
 
9
9
  #include "oboe_api.h"
10
-
10
+ #include <algorithm>
11
11
  /////// Metatdata ///////
12
12
 
13
13
  Metadata::Metadata(const oboe_metadata_t *md) {
@@ -202,9 +202,8 @@ bool Context::isSampled() {
202
202
  }
203
203
 
204
204
  std::string Context::validateTransformServiceName(std::string service_key) {
205
- char service_key_cpy[71 + 1 + 256]; // Flawfinder: ignore, key=71, colon=1, name<=255
206
- memset(service_key_cpy, 0, sizeof(service_key_cpy));
207
- strncpy(service_key_cpy, service_key.c_str(), sizeof(service_key_cpy) - 1); // Flawfinder: ignore
205
+ char service_key_cpy[71 + 1 + 256] = {0}; // Flawfinder: ignore, key=71, colon=1, name<=255
206
+ std::copy_n(service_key.begin(), std::min(service_key.size(), sizeof(service_key_cpy)), std::begin(service_key_cpy));
208
207
  int len = strlen(service_key_cpy); // Flawfinder: ignore
209
208
  int ret = oboe_validate_transform_service_name(service_key_cpy, &len);
210
209
 
@@ -591,7 +590,7 @@ Reporter::Reporter(
591
590
  std::string reporter, // the reporter to be used ("ssl", "upd", "file", "null")
592
591
  std::string host, // collector endpoint (reporter=ssl), udp address (reporter=udp), or file path (reporter=file)
593
592
  std::string service_key, // the service key (also known as access_key)
594
- std::string trusted_path, // path to the SSL certificate (only for ssl)
593
+ std::string certificates, // content of SSL certificates, passed to gRPC::SslCredentialsOptions() for collector connection verification
595
594
 
596
595
  int buffer_size, // size of the message buffer
597
596
  int trace_metrics, // flag indicating if trace metrics reporting should be enabled (default) or disabled
@@ -604,13 +603,11 @@ Reporter::Reporter(
604
603
  std::string grpc_proxy, // HTTP proxy address and port to be used for the gRPC connection
605
604
  int stdout_clear_nonblocking, // flag indicating if the O_NONBLOCK flag on stdout should be cleared,
606
605
  // only used in lambda reporter (off=0, on=1, default off)
607
- int is_grpc_clean_hack_enabled, // flag indicating if custom grpc clean hack enabled (default 0)
608
- int w3c_trace_format, // tag indicating trace id format (0 - legacy Xtrace, 1 - w3c)
609
606
  int metric_format // flag indicating the format of metric (0 = Both; 1 = TransactionResponseTime only; 2 = ResponseTime only; default = 0)
610
607
  ) {
611
608
  oboe_init_options_t options;
612
609
  memset(&options, 0, sizeof(options));
613
- options.version = 14;
610
+ options.version = 15;
614
611
  oboe_init_options_set_defaults(&options);
615
612
 
616
613
  if (hostname_alias != "") {
@@ -631,8 +628,8 @@ Reporter::Reporter(
631
628
  if (service_key != "") {
632
629
  options.service_key = service_key.c_str();
633
630
  }
634
- if (trusted_path != "") {
635
- options.trusted_path = trusted_path.c_str();
631
+ if (certificates != "") {
632
+ options.certificates = certificates.c_str();
636
633
  }
637
634
  options.buffer_size = buffer_size;
638
635
  options.trace_metrics = trace_metrics;
@@ -645,8 +642,6 @@ Reporter::Reporter(
645
642
  options.proxy = grpc_proxy.c_str();
646
643
  }
647
644
  options.stdout_clear_nonblocking = stdout_clear_nonblocking;
648
- options.is_grpc_clean_hack_enabled = is_grpc_clean_hack_enabled;
649
- options.mode = w3c_trace_format;
650
645
  options.metric_format = metric_format;
651
646
  init_status = oboe_init(&options);
652
647
  }
@@ -411,7 +411,7 @@ class Reporter : private oboe_reporter_t {
411
411
  std::string reporter, // the reporter to be used ("ssl", "upd", "file", "null")
412
412
  std::string host, // collector endpoint (reporter=ssl), udp address (reporter=udp), or file path (reporter=file)
413
413
  std::string service_key, // the service key (also known as access_key)
414
- std::string trusted_path, // path to the SSL certificate (only for ssl)
414
+ std::string certificates, // content of SSL certificates, passed to gRPC::SslCredentialsOptions() for collector connection verification
415
415
 
416
416
  int buffer_size, // size of the message buffer
417
417
  int trace_metrics, // flag indicating if trace metrics reporting should be enabled (default) or disabled
@@ -424,8 +424,6 @@ class Reporter : private oboe_reporter_t {
424
424
  std::string grpc_proxy, // HTTP proxy address and port to be used for the gRPC connection
425
425
  int stdout_clear_nonblocking, // flag indicating if the O_NONBLOCK flag on stdout should be cleared,
426
426
  // only used in lambda reporter (off=0, on=1, default off)
427
- int is_grpc_clean_hack_enabled, // flag indicating if custom grpc clean hack enabled (default 0)
428
- int w3c_trace_format, // depreciated; value is ignored
429
427
  int metric_format // flag indicating the format of metric (0 = Both; 1 = TransactionResponseTime only; 2 = ResponseTime only; default = 0)
430
428
  );
431
429
 
@@ -6806,8 +6806,6 @@ _wrap_new_Reporter(int argc, VALUE *argv, VALUE self) {
6806
6806
  std::string arg19 ;
6807
6807
  int arg20 ;
6808
6808
  int arg21 ;
6809
- int arg22 ;
6810
- int arg23 ;
6811
6809
  int val2 ;
6812
6810
  int ecode2 = 0 ;
6813
6811
  int val4 ;
@@ -6836,14 +6834,10 @@ _wrap_new_Reporter(int argc, VALUE *argv, VALUE self) {
6836
6834
  int ecode20 = 0 ;
6837
6835
  int val21 ;
6838
6836
  int ecode21 = 0 ;
6839
- int val22 ;
6840
- int ecode22 = 0 ;
6841
- int val23 ;
6842
- int ecode23 = 0 ;
6843
6837
  Reporter *result = 0 ;
6844
6838
 
6845
- if ((argc < 23) || (argc > 23)) {
6846
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 23)",argc); SWIG_fail;
6839
+ if ((argc < 21) || (argc > 21)) {
6840
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 21)",argc); SWIG_fail;
6847
6841
  }
6848
6842
  {
6849
6843
  std::string *ptr = (std::string *)0;
@@ -6978,17 +6972,7 @@ _wrap_new_Reporter(int argc, VALUE *argv, VALUE self) {
6978
6972
  SWIG_exception_fail(SWIG_ArgError(ecode21), Ruby_Format_TypeError( "", "int","Reporter", 21, argv[20] ));
6979
6973
  }
6980
6974
  arg21 = static_cast< int >(val21);
6981
- ecode22 = SWIG_AsVal_int(argv[21], &val22);
6982
- if (!SWIG_IsOK(ecode22)) {
6983
- SWIG_exception_fail(SWIG_ArgError(ecode22), Ruby_Format_TypeError( "", "int","Reporter", 22, argv[21] ));
6984
- }
6985
- arg22 = static_cast< int >(val22);
6986
- ecode23 = SWIG_AsVal_int(argv[22], &val23);
6987
- if (!SWIG_IsOK(ecode23)) {
6988
- SWIG_exception_fail(SWIG_ArgError(ecode23), Ruby_Format_TypeError( "", "int","Reporter", 23, argv[22] ));
6989
- }
6990
- arg23 = static_cast< int >(val23);
6991
- result = (Reporter *)new Reporter(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21,arg22,arg23);
6975
+ result = (Reporter *)new Reporter(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21);
6992
6976
  DATA_PTR(self) = result;
6993
6977
  return self;
6994
6978
  fail:
data/lib/oboe_metal.rb CHANGED
@@ -66,6 +66,15 @@ module SolarWindsAPM
66
66
  File.truncate(SolarWindsAPM::OboeInitOptions.instance.host, 0)
67
67
  end
68
68
 
69
+ ##
70
+ # hard_clear_all_traces
71
+ #
72
+ # Truncates the trace output file to zero by deleting the original bson file
73
+ #
74
+ def hard_clear_all_traces
75
+ File.delete(SolarWindsAPM::OboeInitOptions.instance.host) if File.exist?(SolarWindsAPM::OboeInitOptions.instance.host)
76
+ end
77
+
69
78
  ##
70
79
  # get_all_traces
71
80
  #
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID8TCCAtmgAwIBAgIJAMoDz7Npas2/MA0GCSqGSIb3DQEBCwUAMIGOMQswCQYD
3
+ VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5j
4
+ aXNjbzEVMBMGA1UECgwMTGlicmF0byBJbmMuMRUwEwYDVQQDDAxBcHBPcHRpY3Mg
5
+ Q0ExJDAiBgkqhkiG9w0BCQEWFXN1cHBvcnRAYXBwb3B0aWNzLmNvbTAeFw0xNzA5
6
+ MTUyMjAxMzlaFw0yNzA5MTMyMjAxMzlaMIGOMQswCQYDVQQGEwJVUzETMBEGA1UE
7
+ CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEVMBMGA1UECgwM
8
+ TGlicmF0byBJbmMuMRUwEwYDVQQDDAxBcHBPcHRpY3MgQ0ExJDAiBgkqhkiG9w0B
9
+ CQEWFXN1cHBvcnRAYXBwb3B0aWNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
10
+ ADCCAQoCggEBAOxO0wsGba3iI4r3L5BMST0rAO/gGaUhpQre6nRwVTmPCnLw1bmn
11
+ GdiFgYv/oRRwU+VieumHSQqoOmyFrg+ajGmvUDp2WqQ0It+XhcbaHFiAp2H7+mLf
12
+ cUH6S43/em0WUxZHeRzRupRDyO1bX6Hh2jgxykivlFrn5HCIQD5Hx1/SaZoW9v2n
13
+ oATCbgFOiPW6kU/AVs4R0VBujon13HCehVelNKkazrAEBT1i6RvdOB6aQQ32seW+
14
+ gLV5yVWSPEJvA9ZJqad/nQ8EQUMSSlVN191WOjp4bGpkJE1svs7NmM+Oja50W56l
15
+ qOH5eWermr/8qWjdPlDJ+I0VkgN0UyHVuRECAwEAAaNQME4wHQYDVR0OBBYEFOuL
16
+ KDTFhRQXwlBRxhPqhukrNYeRMB8GA1UdIwQYMBaAFOuLKDTFhRQXwlBRxhPqhukr
17
+ NYeRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJQtH446NZhjusy6
18
+ iCyvmnD95ybfNPDpjHmNx5n9Y6w9n+9y1o3732HUJE+WjvbLS3h1o7wujGKMcRJn
19
+ 7I7eTDd26ZhLvnh5/AitYjdxrtUkQDgyxwLFJKhZu0ik2vXqj0fL961/quJL8Gyp
20
+ hNj3Nf7WMohQMSohEmCCX2sHyZGVGYmQHs5omAtkH/NNySqmsWNcpgd3M0aPDRBZ
21
+ 5VFreOSGKBTJnoLNqods/S9RV0by84hm3j6aQ/tMDIVE9VCJtrE6evzC0MWyVFwR
22
+ ftgwcxyEq5SkiR+6BCwdzAMqADV37TzXDHLjwSrMIrgLV5xZM20Kk6chxI5QAr/f
23
+ 7tsqAxw=
24
+ -----END CERTIFICATE-----
@@ -57,10 +57,9 @@ module SolarWindsAPM
57
57
  # KVOp (no KVKey)
58
58
 
59
59
  def self.included(klass)
60
- # We wrap two of the Redis methods to instrument
61
- # operations
62
- SolarWindsAPM::Util.method_alias(klass, :call, ::Redis::Client)
63
- SolarWindsAPM::Util.method_alias(klass, :call_pipeline, ::Redis::Client)
60
+ # call_pipelined is alias of call in redisclient middlewares
61
+ SolarWindsAPM::Util.method_alias(klass, :call, ::RedisClient)
62
+ SolarWindsAPM::Util.method_alias(klass, :call_pipelined, ::RedisClient)
64
63
  end
65
64
 
66
65
  # Given any Redis operation command array, this method
@@ -69,12 +68,14 @@ module SolarWindsAPM
69
68
  # @param command [Array] the Redis operation array
70
69
  # @param r [Return] the return value from the operation
71
70
  # @return [Hash] the Key/Values to report
72
- def extract_trace_details(command, r)
71
+ def extract_trace_details(command, r, config)
72
+ SolarWindsAPM.logger.debug "extract_trace_details command => #{command.inspect}"
73
73
  kvs = {}
74
74
  op = command.first
75
+ op = op.to_sym
75
76
 
76
77
  kvs[:KVOp] = command[0]
77
- kvs[:RemoteHost] = @options[:host]
78
+ kvs[:RemoteHost] = config.host
78
79
  unless NO_KEY_OPS.include?(op) || op == :del && command[1..-1].flatten.count > 1
79
80
  if command[1].is_a?(Array)
80
81
  kvs[:KVKey] = command[1].first
@@ -115,7 +116,7 @@ module SolarWindsAPM
115
116
  kvs[:KVHit] = r.nil? ? 0 : 1
116
117
 
117
118
  when :hdel, :hexists, :hget, :hset, :hsetnx
118
- kvs[:field] = command[2] unless command[2].is_a?(Array)
119
+ kvs[:field] = command[2] unless (command[2] && command[3]) # replace the idiom of command[2].is_a?(Array)
119
120
  if op == :hget
120
121
  kvs[:KVHit] = r.nil? ? 0 : 1
121
122
  end
@@ -136,7 +137,7 @@ module SolarWindsAPM
136
137
  else
137
138
  kvs[:Script] = command[2]
138
139
  end
139
- elsif command[1] == :exists
140
+ elsif command[1] == "exists"
140
141
  if command[2].is_a?(Array)
141
142
  kvs[:KVKey] = command[2].inspect
142
143
  else
@@ -166,6 +167,10 @@ module SolarWindsAPM
166
167
  end
167
168
  end # case op
168
169
  end # if KV_COLLECT_MAP[op]
170
+ # turn every string into number
171
+ # kvs.each do |k,v|
172
+ # kvs[k] = v.to_i if v.is_a(String)
173
+ # end
169
174
  rescue StandardError => e
170
175
  SolarWindsAPM.logger.debug "[solarwinds_apm/redis] Error collecting redis KVs: #{e.message}"
171
176
  SolarWindsAPM.logger.debug e.backtrace.join('\n')
@@ -178,16 +183,17 @@ module SolarWindsAPM
178
183
  #
179
184
  # @param pipeline [Redis::Pipeline] the Redis pipeline instance
180
185
  # @return [Hash] the Key/Values to report
181
- def extract_pipeline_details(pipeline)
186
+ def extract_pipeline_details(commands, config)
187
+ SolarWindsAPM.logger.debug "extract_pipeline_details command => #{commands.inspect}"
182
188
  kvs = {}
183
189
 
184
- kvs[:RemoteHost] = @options[:host]
190
+ kvs[:RemoteHost] = config.host
185
191
  kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:redis][:collect_backtraces]
186
192
 
187
- command_count = pipeline.commands.count
193
+ command_count = commands.count
188
194
  kvs[:KVOpCount] = command_count
189
195
 
190
- kvs[:KVOp] = if pipeline.commands.first == :multi
196
+ kvs[:KVOp] = if commands.first == :multi
191
197
  :multi
192
198
  else
193
199
  :pipeline
@@ -197,7 +203,7 @@ module SolarWindsAPM
197
203
  # of ops is reasonable
198
204
  if command_count < 12
199
205
  ops = []
200
- pipeline.commands.each do |c|
206
+ commands.each do |c|
201
207
  ops << c.first
202
208
  end
203
209
  kvs[:KVOps] = ops.join(', ')
@@ -210,17 +216,19 @@ module SolarWindsAPM
210
216
  end
211
217
 
212
218
  #
213
- # The wrapper method for Redis::Client.call. Here
219
+ # The wrapper method for RedisClient.call. Here
214
220
  # (when tracing) we capture KVs to report and pass
215
221
  # the call along
216
222
  #
217
- def call_with_sw_apm(command, &block)
223
+ def call_with_sw_apm(command, config, &block)
224
+ SolarWindsAPM.logger.debug "call_with_sw_apm command => #{command.inspect}"
218
225
  if SolarWindsAPM.tracing?
219
226
  SolarWindsAPM::API.log_entry(:redis, {})
220
227
 
221
228
  begin
222
- r = call_without_sw_apm(command, &block)
223
- report_kvs = extract_trace_details(command, r)
229
+ r = call_without_sw_apm(command, config, &block)
230
+ report_kvs = extract_trace_details(command, r, config)
231
+ SolarWindsAPM.logger.debug "call_with_sw_apm command => #{report_kvs.inspect}"
224
232
  r
225
233
  rescue StandardError => e
226
234
  SolarWindsAPM::API.log_exception(:redis, e)
@@ -230,26 +238,25 @@ module SolarWindsAPM
230
238
  end
231
239
 
232
240
  else
233
- call_without_sw_apm(command, &block)
241
+ call_without_sw_apm(command, config, &block)
234
242
  end
235
243
  end
236
244
 
237
245
  #
238
- # The wrapper method for Redis::Client.call_pipeline. Here
246
+ # The wrapper method for RedisClient.call_pipeline. Here
239
247
  # (when tracing) we capture KVs to report and pass the call along
240
- #
241
- def call_pipeline_with_sw_apm(pipeline)
248
+ # 5.0.0 + removed the deprecated pipelined and multi signature. Commands now MUST be called on the block argument, not the original redis instance
249
+ def call_pipelined_with_sw_apm(commands, config, &block)
250
+ SolarWindsAPM.logger.debug "call_pipelined_with_sw_apm command => #{commands.inspect}"
242
251
  if SolarWindsAPM.tracing?
243
252
  # Fall back to the raw tracing API so we can pass KVs
244
253
  # back on exit (a limitation of the SolarWindsAPM::API.trace
245
254
  # block method) This removes the need for an info
246
255
  # event to send additonal KVs
247
256
  SolarWindsAPM::API.log_entry(:redis, {})
248
-
249
- report_kvs = extract_pipeline_details(pipeline)
250
-
257
+ report_kvs = extract_pipeline_details(commands, config)
251
258
  begin
252
- call_pipeline_without_sw_apm(pipeline)
259
+ call_pipelined_without_sw_apm(commands, config, &block)
253
260
  rescue StandardError => e
254
261
  SolarWindsAPM::API.log_exception(:redis, e)
255
262
  raise
@@ -257,7 +264,7 @@ module SolarWindsAPM
257
264
  SolarWindsAPM::API.log_exit(:redis, report_kvs)
258
265
  end
259
266
  else
260
- call_pipeline_without_sw_apm(pipeline)
267
+ call_pipelined_without_sw_apm(commands, config, &block)
261
268
  end
262
269
  end
263
270
  end
@@ -266,8 +273,8 @@ module SolarWindsAPM
266
273
  end
267
274
 
268
275
  if SolarWindsAPM::Config[:redis][:enabled]
269
- if defined?(Redis) && Gem::Version.new(Redis::VERSION) >= Gem::Version.new('3.0.0')
270
- SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting redis' if SolarWindsAPM::Config[:verbose]
271
- SolarWindsAPM::Util.send_include(Redis::Client, SolarWindsAPM::Inst::Redis::Client)
276
+ if defined?(::RedisClient)
277
+ SolarWindsAPM.logger.info "[solarwinds_apm/loading] Instrumenting redis #{Redis::VERSION}" if SolarWindsAPM::Config[:verbose]
278
+ ::RedisClient.register(SolarWindsAPM::Inst::Redis::Client)
272
279
  end
273
280
  end