fluent-plugin-juniper-telemetry 0.2.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c6cababee592eb8a30f399415a1b99eac024fd22
4
+ data.tar.gz: ac660b8de786e4d4ccfb38837659f53e28de6dde
5
+ SHA512:
6
+ metadata.gz: 5da21d83ec990c8ea733fa77ed2958401b892ee61f1da6cff1c05d1298a47b1ce9250c43ce6c9219e33690ef9af8ce25f03ec8ec1f6036d259cbac1d1efca45f
7
+ data.tar.gz: a1353850da699ba1d785f354e6fc28176d81cb37ec5d16643c0f740985741b0f5ddbf99b30b8c1a7334a91e2acee0db30e0801238787a077bc68050cdf8f491d
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ ##
4
+ # This file is auto-generated. DO NOT EDIT!
5
+ #
6
+ require 'protobuf'
7
+
8
+
9
+ ##
10
+ # Imports
11
+ #
12
+ require 'telemetry_top.pb'
13
+
14
+
15
+ ##
16
+ # Message Classes
17
+ #
18
+ class CpuMemoryUtilization < ::Protobuf::Message; end
19
+ class CpuMemoryUtilizationSummary < ::Protobuf::Message; end
20
+ class CpuMemoryUtilizationPerApplication < ::Protobuf::Message; end
21
+
22
+
23
+ ##
24
+ # Message Fields
25
+ #
26
+ class CpuMemoryUtilization
27
+ repeated ::CpuMemoryUtilizationSummary, :utilization, 1
28
+ end
29
+
30
+ class CpuMemoryUtilizationSummary
31
+ optional :string, :name, 1
32
+ optional :uint64, :size, 2
33
+ optional :uint64, :bytes_allocated, 3
34
+ optional :int32, :utilization, 4
35
+ repeated ::CpuMemoryUtilizationPerApplication, :application_utilization, 5
36
+ end
37
+
38
+ class CpuMemoryUtilizationPerApplication
39
+ optional :string, :name, 1
40
+ optional :uint64, :bytes_allocated, 2
41
+ optional :uint64, :allocations, 3
42
+ optional :uint64, :frees, 4
43
+ optional :uint64, :allocations_failed, 5
44
+ end
45
+
46
+
47
+ ##
48
+ # Extended Message Fields
49
+ #
50
+ class ::JuniperNetworksSensors < ::Protobuf::Message
51
+ optional ::CpuMemoryUtilization, :".cpu_memory_util_ext", 1, :extension => true
52
+ end
53
+
@@ -3,13 +3,13 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
10
10
  # Imports
11
11
  #
12
- require 'jvision_top.pb'
12
+ require 'telemetry_top.pb'
13
13
 
14
14
 
15
15
  ##
@@ -78,6 +78,6 @@ end
78
78
  # Extended Message Fields
79
79
  #
80
80
  class ::JuniperNetworksSensors < ::Protobuf::Message
81
- optional ::Firewall, :jnpr_firewall_ext, 6, :extension => true
81
+ optional ::Firewall, :".jnpr_firewall_ext", 6, :extension => true
82
82
  end
83
83
 
@@ -1,10 +1,11 @@
1
1
  require 'juniper_telemetry_lib.rb'
2
2
  require 'protobuf'
3
- require 'jvision_top.pb.rb'
3
+ require 'telemetry_top.pb.rb'
4
4
  require 'port.pb.rb'
5
5
  require 'lsp_stats.pb.rb'
6
6
  require 'logical_port.pb.rb'
7
7
  require 'firewall.pb.rb'
8
+ require 'cpu_memory_utilization.pb.rb'
8
9
 
9
10
  module Fluent
10
11
  class TextParser
@@ -58,6 +59,7 @@ module Fluent
58
59
  if sensor == "jnpr_interface_ext"
59
60
 
60
61
  resource = "/junos/system/linecard/interface/"
62
+ $log.debug "Will extract info for Sensor: #{sensor} / Resource #{resource}"
61
63
 
62
64
  datas_sensors[sensor]['interface_stats'].each do |datas|
63
65
 
@@ -123,41 +125,19 @@ module Fluent
123
125
  $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas.inspect.to_s
124
126
  end
125
127
  end
126
- ##############################################################
127
- ### Support for resource /junos/system/linecard/firewall/ ##
128
- ##############################################################
129
- # elsif sensor == "jnpr_firewall_ext"
130
- #
131
- # resource = "/junos/system/linecard/firewall"
132
- #
133
- # datas_sensors[sensor]['firewall_stats'].each do |datas|
134
- #
135
- # begin
136
- # ## Extract interface name and clean up
137
- # sensor_data.push({ 'device' => device_name })
138
- # sensor_data.push({ 'filter_name' => datas['filter_name'] })
139
- #
140
- # ## Clean up Current object
141
- # # datas.delete("filter_name")
142
- #
143
- # $log.warn "Sensor Filter : " + datas['filter_name']
144
- #
145
- # rescue
146
- # $log.warn "Unable to parse " + sensor + " sensor, an error occured.."
147
- # $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas.inspect.to_s
148
- # end
149
- # end
150
- #####################################################################
151
- ### Support for resource /junos/services/label-switched-path/usage/##
152
- #####################################################################
153
- #datas Dump : {"name"=>"to_mx104-9", "instance_identifier"=>0,
154
- # "counter_name"=>"c-25", "packets"=>2521648779, "bytes"=>2526692076558,
155
- # "packet_rate"=>598640, "byte_rate"=>599837511}
156
- elsif sensor == "jnpr_lsp_statistics_ext"
157
-
158
- resource = "/junos/services/label-switched-path/usage/"
159
-
160
- datas_sensors[sensor]['lsp_stats_records'].each do |datas|
128
+
129
+ #####################################################################
130
+ ### Support for resource /junos/services/label-switched-path/usage/##
131
+ #####################################################################
132
+ #datas Dump : {"name"=>"to_mx104-9", "instance_identifier"=>0,
133
+ # "counter_name"=>"c-25", "packets"=>2521648779, "bytes"=>2526692076558,
134
+ # "packet_rate"=>598640, "byte_rate"=>599837511}
135
+ elsif sensor == "jnpr_lsp_statistics_ext"
136
+
137
+ resource = "/junos/services/label-switched-path/usage/"
138
+ $log.debug "Will extract info for Sensor: #{sensor} / Resource #{resource}"
139
+
140
+ datas_sensors[sensor]['lsp_stats_records'].each do |datas|
161
141
 
162
142
  # Save all info extracted on a list
163
143
  sensor_data = []
@@ -189,14 +169,84 @@ module Fluent
189
169
  end
190
170
  end
191
171
 
192
- ##############################################################
193
- ### Support for resource /junos/system/linecard/interface/logical/usage ##
194
- ##############################################################
195
- elsif sensor == "jnprLogicalInterfaceExt"
172
+ ##############################################################
173
+ ### Support for resource /junos/system/linecard/interface/logical/usage ##
174
+ ##############################################################
175
+ elsif sensor == "jnprLogicalInterfaceExt"
176
+
177
+ resource = "/junos/system/linecard/interface/logical/usage"
178
+ $log.debug "Will extract info for Sensor: #{sensor} / Resource #{resource}"
179
+
180
+ datas_sensors[sensor]['interface_info'].each do |datas|
181
+
182
+ # Save all info extracted on a list
183
+ sensor_data = []
184
+
185
+ begin
186
+ ## Extract interface name and clean up
187
+ sensor_data.push({ 'device' => device_name })
188
+ sensor_data.push({ 'interface' => datas['if_name'] })
189
+
190
+ ## Clean up Current object
191
+ datas.delete("if_name")
192
+ datas.delete("init_time")
193
+ datas.delete("snmp_if_index")
194
+ datas.delete("op_state")
195
+
196
+ # Check if the interface has a parent
197
+ if datas.key?('parent_ae_name')
198
+ sensor_data.push({ 'interface_parent' => datas['parent_ae_name'] })
199
+ datas.delete("parent_ae_name")
200
+ end
201
+
202
+ datas.each do |section, data|
203
+ data.each do |type, value|
204
+
205
+ local_sensor_data = sensor_data.dup
206
+
207
+ if value.kind_of?(Array)
208
+ value.each do |entry|
209
+
210
+ ['if_packets', 'if_octets'].each do |data_type|
211
+ local_sensor_data.push({ 'forwarding_class' => entry['fc_number'] })
212
+ local_sensor_data.push({ 'family' => entry['if_family'] })
213
+ local_sensor_data.push({ 'type' => section + '.' + type + '.' + data_type })
214
+ local_sensor_data.push({ 'value' => entry[data_type] })
215
+
216
+ record = build_record(output_format, local_sensor_data)
217
+ yield gpb_time, record
218
+ end
219
+ end
220
+ else
221
+ local_sensor_data.push({ 'type' => section + '.' + type })
222
+ local_sensor_data.push({ 'value' => value })
223
+
224
+ record = build_record(output_format, local_sensor_data)
225
+
226
+ yield gpb_time, record
227
+ end
228
+ end
229
+ end
230
+ rescue => e
231
+ $log.warn "Unable to parse " + sensor + " sensor, Error during processing: #{$!}"
232
+ $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas.inspect.to_s
233
+ end
234
+ end
235
+
236
+ ##############################################################
237
+ ### Support for resource /junos/system/linecard/firewall/ ##
238
+ ##############################################################
239
+ #{"message":"Unable to parse jnpr_firewall_ext sensor, Data Dump : {\"jnpr_firewall_ext\"=>
240
+ #{\"firewall_stats\"=>[{\"filter_name\"=>\"__default_bpdu_filter__\", \"timestamp\"=>1465467390, \"memory_usage\"=>[{\"name\"=>\"HEAP\", \"allocated\"=>2440}]},
241
+ #{\"filter_name\"=>\"test\", \"timestamp\"=>1465467390, \"memory_usage\"=>[{\"name\"=>\"HEAP\", \"allocated\"=>1688}],
242
+ #\"counter_stats\"=>[{\"name\"=>\"cnt1\", \"packets\"=>79, \"bytes\"=>6320}]},
243
+ #{\"filter_name\"=>\"__default_arp_policer__\", \"timestamp\"=>1464456904, \"memory_usage\"=>[{\"name\"=>\"HEAP\", \"allocated\"=>1600}]}]}}"}
244
+ elsif sensor == "jnpr_firewall_ext"
196
245
 
197
- resource = "/junos/system/linecard/interface/logical/usage"
246
+ resource = "/junos/system/linecard/firewall/"
247
+ $log.debug "Will extract info for Sensor: #{sensor} / Resource #{resource}"
198
248
 
199
- datas_sensors[sensor]['interface_info'].each do |datas|
249
+ datas_sensors[sensor]['firewall_stats'].each do |datas|
200
250
 
201
251
  # Save all info extracted on a list
202
252
  sensor_data = []
@@ -204,28 +254,81 @@ module Fluent
204
254
  begin
205
255
  ## Extract interface name and clean up
206
256
  sensor_data.push({ 'device' => device_name })
207
- sensor_data.push({ 'interface' => datas['if_name'] })
257
+ sensor_data.push({ 'filter_name' => datas['filter_name'] })
258
+ sensor_data.push({ 'filter_timestamp' => datas['timestamp'] })
208
259
 
209
260
  ## Clean up Current object
210
- datas.delete("if_name")
211
- datas.delete("init_time")
212
- datas.delete("snmp_if_index")
213
- datas.delete("op_state")
261
+ datas.delete("filter_name")
262
+ datas.delete("timestamp")
214
263
 
215
- datas.each do |section, data|
216
- data.each do |type, value|
217
-
218
- sensor_data.push({ 'type' => section + '.' + type })
219
- sensor_data.push({ 'value' => value })
264
+ if datas.key?('memory_usage')
265
+ datas['memory_usage'].each do |memory_usage|
266
+ sensor_data.push({ 'type' => 'memory_usage.' + memory_usage['name'] })
267
+ sensor_data.push({ 'value' => memory_usage['allocated'] })
268
+ memory_usage.delete("name")
269
+ memory_usage.delete("allocated")
220
270
 
221
271
  record = build_record(output_format, sensor_data)
222
272
  yield gpb_time, record
273
+ end
223
274
 
275
+ ## Clean up Current object
276
+ datas.delete("memory_usage")
277
+ end
278
+
279
+ if datas.key?('counter_stats')
280
+ datas['counter_stats'].each do |counters|
281
+ sensor_data.push({ 'filter_counter_name' => counters['name'] })
282
+ counters.delete("name")
283
+ counters.each do |type, value|
284
+ sensor_data.push({ 'type' => 'filter_counter.' + type })
285
+ sensor_data.push({ 'value' => value })
286
+ record = build_record(output_format, sensor_data)
287
+ yield gpb_time, record
288
+ end
224
289
  end
225
290
  end
291
+
226
292
  rescue => e
227
293
  $log.warn "Unable to parse " + sensor + " sensor, Error during processing: #{$!}"
228
- $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas.inspect.to_s
294
+ $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas_sensors.inspect.to_s
295
+ end
296
+ end
297
+ #####################################################################
298
+ ### Support for resource /junos/TBD /##
299
+ #####################################################################
300
+ elsif sensor == "cpu_memory_util_ext"
301
+
302
+ resource = "/junos/TBD/"
303
+ $log.debug "Will extract info for Sensor: #{sensor} / Resource #{resource}"
304
+
305
+ datas_sensors[sensor]['utilization'].each do |datas|
306
+
307
+ # Save all info extracted on a list
308
+ sensor_data = []
309
+
310
+ begin
311
+ ## Extract interface name and clean up
312
+ sensor_data.push({ 'device' => device_name })
313
+
314
+ name = clean_up_name(datas['name'])
315
+
316
+ ## Clean up Current object
317
+ datas.delete("name")
318
+
319
+ datas.each do |type, value|
320
+
321
+ sensor_data.push({ 'type' => 'cpu_mem.' + type })
322
+ sensor_data.push({ 'name' => name })
323
+ sensor_data.push({ 'value' => value })
324
+
325
+ record = build_record(output_format, sensor_data)
326
+ yield gpb_time, record
327
+
328
+ end
329
+ rescue => e
330
+ $log.warn "Unable to parse " + sensor + " sensor, Error during processing: #{$!}"
331
+ $log.debug "Unable to parse " + sensor + " sensor, Data Dump : " + datas_sensors.inspect.to_s
229
332
  end
230
333
  end
231
334
  else
@@ -3,10 +3,11 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
  module Google
9
9
  module Protobuf
10
+ ::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
10
11
 
11
12
  ##
12
13
  # Message Classes
@@ -15,7 +15,7 @@ def epoc_to_sec(epoc)
15
15
  elsif nbr_digit == 16
16
16
  return (epoc.to_i/1000000).to_i
17
17
  end
18
-
18
+
19
19
  return epoc
20
20
  end
21
21
 
@@ -28,6 +28,7 @@ def clean_up_name(name)
28
28
  tmp.gsub!('/', '_')
29
29
  tmp.gsub!(':', '_')
30
30
  tmp.gsub!('.', '_')
31
+ tmp.gsub!(' ', '_')
31
32
 
32
33
  return tmp
33
34
  end
@@ -3,13 +3,13 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
10
10
  # Imports
11
11
  #
12
- require 'jvision_top.pb'
12
+ require 'telemetry_top.pb'
13
13
 
14
14
 
15
15
  ##
@@ -69,6 +69,6 @@ end
69
69
  # Extended Message Fields
70
70
  #
71
71
  class ::JuniperNetworksSensors < ::Protobuf::Message
72
- optional ::LogicalPort, :jnprLogicalInterfaceExt, 7, :extension => true
72
+ optional ::LogicalPort, :".jnprLogicalInterfaceExt", 7, :extension => true
73
73
  end
74
74
 
@@ -3,7 +3,7 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
@@ -3,13 +3,13 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
10
10
  # Imports
11
11
  #
12
- require 'jvision_top.pb'
12
+ require 'telemetry_top.pb'
13
13
 
14
14
 
15
15
  ##
@@ -41,6 +41,6 @@ end
41
41
  # Extended Message Fields
42
42
  #
43
43
  class ::JuniperNetworksSensors < ::Protobuf::Message
44
- optional ::LspStats, :jnpr_lsp_statistics_ext, 5, :extension => true
44
+ optional ::LspStats, :".jnpr_lsp_statistics_ext", 5, :extension => true
45
45
  end
46
46
 
@@ -3,13 +3,13 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
10
10
  # Imports
11
11
  #
12
- require 'jvision_top.pb'
12
+ require 'telemetry_top.pb'
13
13
 
14
14
 
15
15
  ##
@@ -84,6 +84,6 @@ end
84
84
  # Extended Message Fields
85
85
  #
86
86
  class ::JuniperNetworksSensors < ::Protobuf::Message
87
- optional ::GPort, :jnpr_interface_ext, 3, :extension => true
87
+ optional ::GPort, :".jnpr_interface_ext", 3, :extension => true
88
88
  end
89
89
 
@@ -3,7 +3,7 @@
3
3
  ##
4
4
  # This file is auto-generated. DO NOT EDIT!
5
5
  #
6
- require 'protobuf/message'
6
+ require 'protobuf'
7
7
 
8
8
 
9
9
  ##
@@ -50,10 +50,10 @@ end
50
50
  # Extended Message Fields
51
51
  #
52
52
  class ::Google::Protobuf::FieldOptions < ::Protobuf::Message
53
- optional ::TelemetryFieldOptions, :telemetry_options, 1024, :extension => true
53
+ optional ::TelemetryFieldOptions, :".telemetry_options", 1024, :extension => true
54
54
  end
55
55
 
56
56
  class ::EnterpriseSensors < ::Protobuf::Message
57
- optional ::JuniperNetworksSensors, :juniperNetworks, 2636, :extension => true
57
+ optional ::JuniperNetworksSensors, :".juniperNetworks", 2636, :extension => true
58
58
  end
59
59
 
metadata CHANGED
@@ -1,65 +1,58 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-juniper-telemetry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Damien Garros
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2016-04-26 00:00:00.000000000 Z
11
+ date: 2016-12-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: fluentd
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: 0.10.58
19
+ version: 0.12.29
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 0.10.58
26
+ version: 0.12.29
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: protobuf
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
- description: ! 'Input plugin for Fluentd for Juniper devices telemetry data streaming
55
+ description: 'Input plugin for Fluentd for Juniper devices telemetry data streaming
63
56
  : Jvision / analyticsd etc ..'
64
57
  email:
65
58
  - dgarros@gmail.com
@@ -67,41 +60,41 @@ executables: []
67
60
  extensions: []
68
61
  extra_rdoc_files: []
69
62
  files:
70
- - lib/fluent/plugin/parser_juniper_jti.rb
63
+ - lib/cpu_memory_utilization.pb.rb
64
+ - lib/firewall.pb.rb
71
65
  - lib/fluent/plugin/parser_juniper_analyticsd.rb
66
+ - lib/fluent/plugin/parser_juniper_jti.rb
72
67
  - lib/fluent/plugin/parser_juniper_na.rb
68
+ - lib/google/protobuf/descriptor.pb.rb
73
69
  - lib/juniper_telemetry_lib.rb
74
- - lib/jvision_top.pb.rb
75
- - lib/port.pb.rb
76
- - lib/firewall.pb.rb
77
- - lib/lsp_mon.pb.rb
78
70
  - lib/logical_port.pb.rb
71
+ - lib/lsp_mon.pb.rb
79
72
  - lib/lsp_stats.pb.rb
80
- - lib/google/protobuf/descriptor.pb.rb
73
+ - lib/port.pb.rb
74
+ - lib/telemetry_top.pb.rb
81
75
  homepage: https://github.com/JNPRAutomate/fluentd-plugin-juniper-telemetry
82
76
  licenses:
83
77
  - Apache 2.0
78
+ metadata: {}
84
79
  post_install_message:
85
80
  rdoc_options: []
86
81
  require_paths:
87
82
  - lib
88
83
  required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
84
  requirements:
91
- - - ! '>='
85
+ - - ">="
92
86
  - !ruby/object:Gem::Version
93
87
  version: '0'
94
88
  required_rubygems_version: !ruby/object:Gem::Requirement
95
- none: false
96
89
  requirements:
97
- - - ! '>='
90
+ - - ">="
98
91
  - !ruby/object:Gem::Version
99
92
  version: '0'
100
93
  requirements: []
101
94
  rubyforge_project:
102
- rubygems_version: 1.8.23
95
+ rubygems_version: 2.5.1
103
96
  signing_key:
104
- specification_version: 3
105
- summary: ! 'Input plugin for Fluentd for Juniper devices telemetry data streaming
106
- : Jvision / analyticsd etc ..'
97
+ specification_version: 4
98
+ summary: 'Input plugin for Fluentd for Juniper devices telemetry data streaming :
99
+ Jvision / analyticsd etc ..'
107
100
  test_files: []