fluent-plugin-windows-exporter 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,124 @@
1
+ #
2
+ # Copyright 2021- daipom
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'hkey_perf_data_reader'
17
+ require_relative 'in_windows_exporter'
18
+ require 'benchmark'
19
+ require 'net/http'
20
+
21
+ def get_data_from_prometheus_windows_exporter(uri = "http://localhost:9182/metrics")
22
+ response = Net::HTTP.get_response(URI(uri))
23
+ return nil, false unless response.code == "200"
24
+
25
+ lines = response.body.split("\n")
26
+ .map { |line| line.strip}
27
+ .select { |line| !line.empty? && !line.start_with?("#") }
28
+
29
+ prometheous_records = []
30
+
31
+ lines.each do |line|
32
+ record = {
33
+ "name" => "",
34
+ "value" => 0.0,
35
+ "labels" => {},
36
+ }
37
+ i = line.index("{")
38
+
39
+ no_label_data = i.nil?
40
+ if no_label_data
41
+ i = line.index(" ")
42
+ record["name"] = line[0..i-1]
43
+ record["value"] = line[i+1..].to_f
44
+ else
45
+ record["name"] = line[0..i-1]
46
+ end_label_i = line.index("}")
47
+ record["value"] = line[end_label_i+1..].to_f
48
+ label = line[i+1..end_label_i-1]
49
+ while true
50
+ i = label.index("=\"")
51
+ break if i.nil?
52
+ key = label[0..i-1]
53
+ end_val_i = label.index("\"", i+2)
54
+ val = label[i+2..end_val_i-1]
55
+ record["labels"][key] = val
56
+ label = label[end_val_i+2..]
57
+ break if label.to_s.empty?
58
+ end
59
+ end
60
+
61
+ prometheous_records.append(record)
62
+ end
63
+
64
+ return prometheous_records, true
65
+ end
66
+
67
+ def is_same_hash?(h1, h2)
68
+ h1.to_a.map { |k, v| [k.to_s, v] } == h2.to_a.map { |k, v| [k.to_s, v] }
69
+ end
70
+
71
+ a, b = get_data_from_prometheus_windows_exporter
72
+
73
+ p a.map { |record| record["name"] }
74
+
75
+ # reader = HKeyPerfDataReader::Reader.new(
76
+ # object_name_whitelist: Fluent::Plugin::HKeyPerfDataWhiteList::NAMES
77
+ # )
78
+ # result = reader.read
79
+ # p result.keys
80
+
81
+ # 10.times do
82
+ # result = Benchmark.realtime do
83
+ # reader.read
84
+ # end
85
+ # p result
86
+ # end
87
+
88
+ # p "Read RawData by fiddle"
89
+
90
+ # raw_data_list = []
91
+ # 3.times do
92
+ # result = Benchmark.realtime do
93
+ # raw_data_list.append(HKeyPerfDataReader::RawReader.read)
94
+ # end
95
+ # p result
96
+ # end
97
+
98
+ # p "Parse RawData in ruby"
99
+
100
+ # raw_data_list.each do |raw_data|
101
+ # result = Benchmark.realtime do
102
+ # reader.read(raw_data)
103
+ # end
104
+ # p result
105
+ # end
106
+
107
+ # require 'benchmark'
108
+ # require 'uri'
109
+ # require 'net/http'
110
+
111
+ # 10.times do
112
+ # result = Benchmark.realtime do
113
+ # uri = URI("http://localhost:9182/metrics")
114
+ # Net::HTTP.get_response(uri)
115
+ # end
116
+ # p result
117
+ # end
118
+
119
+
120
+ # pp result["Memory"].instances[0].counters["Free & Zero Page List Bytes"]
121
+ # pp result["Memory"].instances[0].counters["Available Bytes"]
122
+ # pp result["Memory"].instances[0].counters["Cache Bytes"]
123
+
124
+ # p result["Memory"].counters
@@ -0,0 +1,164 @@
1
+ require "fiddle/import"
2
+ require "fiddle/types"
3
+ require "win32/registry"
4
+
5
+ # A thin wrapper over Win32 API. You can use this as follows:
6
+ #
7
+ # Usage:
8
+ # require_relative 'winffi'
9
+ # WinFFI.GetMemoryStatus() # => {:TotalPhys=>4294496256, ... }
10
+ #
11
+ # Public API:
12
+ # * WinFFI.GetMemoryStatus() ... Wraps GetMemoryStatusEx()
13
+ # * WinFFI.GetPerformanceInfo() ... Wraps GetPerformanceInfo()
14
+ # * WinFFI.GetWorkstationInfo() ... Wraps NetWkstaGetInfo()
15
+ # * WinFFI.GetRegistryInfo() ... Return bits from registry
16
+
17
+ module WinFFI
18
+
19
+ # https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex
20
+ module Kernel32
21
+ extend Fiddle::Importer
22
+ dlload "Kernel32.dll"
23
+ include Fiddle::Win32Types
24
+ extern "BOOL GlobalMemoryStatusEx(void*)"
25
+ MemoryStatusEx = struct([
26
+ "DWORD dwLength",
27
+ "DWORD dwMemoryLoad",
28
+ "DWORD64 ullTotalPhys",
29
+ "DWORD64 ullAvailPhys",
30
+ "DWORD64 ullTotalPageFile",
31
+ "DWORD64 ullAvailPageFile",
32
+ "DWORD64 ullTotalVirtual",
33
+ "DWORD64 ullAvailVirtual",
34
+ "DWORD64 ullAvailExtendedVirtual",
35
+ ])
36
+ end
37
+
38
+ # https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getperformanceinfo
39
+ module Psapi
40
+ extend Fiddle::Importer
41
+ dlload "Psapi.dll"
42
+ include Fiddle::Win32Types
43
+ extern "BOOL GetPerformanceInfo(void*, DWORD)"
44
+ PERFORMANCE_INFORMATION = struct([
45
+ "DWORD cb",
46
+ "size_t CommitTotal",
47
+ "size_t CommitLimit",
48
+ "size_t CommitPeak",
49
+ "size_t PhysicalTotal",
50
+ "size_t PhysicalAvailable",
51
+ "size_t SystemCache",
52
+ "size_t KernelTotal",
53
+ "size_t KernelPaged",
54
+ "size_t KernelNonpaged",
55
+ "size_t PageSize",
56
+ "DWORD HandleCount",
57
+ "DWORD ProcessCount",
58
+ "DWORD ThreadCount"
59
+ ])
60
+ end
61
+
62
+ # https://docs.microsoft.com/en-us/windows/win32/api/lmwksta/nf-lmwksta-netwkstagetinfo
63
+ module NetAPI32
64
+ extend Fiddle::Importer
65
+ dlload "Netapi32.dll"
66
+ include Fiddle::Win32Types
67
+ extern "DWORD NetWkstaGetInfo(void *, DWORD, void*)"
68
+ extern "DWORD NetWkstaUserGetInfo(void*, DWORD, void*)"
69
+ extern "DWORD NetApiBufferFree(void*)"
70
+
71
+ WKSTA_INFO_102 = struct([
72
+ "DWORD wki102_platform_id",
73
+ "PVOID wki102_computername",
74
+ "PVOID wki102_langroup",
75
+ "DWORD wki102_ver_major",
76
+ "DWORD wki102_ver_minor",
77
+ "PVOID wki102_lanroot",
78
+ "DWORD wki102_logged_on_users",
79
+ ])
80
+ end
81
+
82
+ #--------------
83
+ # API functions
84
+ #--------------
85
+ def self.GetMemoryStatus()
86
+ buf = Kernel32::MemoryStatusEx.malloc
87
+ buf.dwLength = Kernel32::MemoryStatusEx.size
88
+ if not Kernel32.GlobalMemoryStatusEx(buf)
89
+ raise "GetMemoryStatusEx() failed (err=#{Fiddle.win32_last_error})"
90
+ end
91
+
92
+ return {
93
+ :TotalPhys => buf.ullTotalPhys,
94
+ :AvailPhys => buf.ullAvailPhys,
95
+ :TotalPageFile => buf.ullTotalPageFile,
96
+ :AvailPageFile => buf.ullAvailPageFile,
97
+ :TotalVirtual => buf.ullTotalVirtual,
98
+ :AvailVirtual => buf.ullAvailVirtual,
99
+ :AvailExtendedVirtual => buf.ullAvailExtendedVirtual
100
+ }
101
+ end
102
+
103
+ def self.GetPerformanceInfo()
104
+ buf = Psapi::PERFORMANCE_INFORMATION.malloc
105
+ size = Psapi::PERFORMANCE_INFORMATION.size
106
+ buf.cb = size
107
+ if not Psapi.GetPerformanceInfo(buf, size)
108
+ raise "GetPerformanceInfo() failed (err=#{Fiddle.win32_last_error})"
109
+ end
110
+ return {
111
+ :CommitTotal => buf.CommitTotal,
112
+ :CommitLimit => buf.CommitLimit,
113
+ :CommitPeak => buf.CommitPeak,
114
+ :PhysicalTotal => buf.PhysicalTotal,
115
+ :PhysicalAvailable => buf.PhysicalAvailable,
116
+ :SystemCache => buf.SystemCache,
117
+ :KernelTotal => buf.KernelTotal,
118
+ :KernelPaged => buf.KernelPaged,
119
+ :KernelNonpaged => buf.KernelNonpaged,
120
+ :PageSize => buf.PageSize,
121
+ :HandleCount => buf.HandleCount,
122
+ :ProcessCount => buf.ProcessCount,
123
+ :ThreadCount => buf.ThreadCount
124
+ }
125
+ end
126
+
127
+ def self.GetWorkstationInfo
128
+ buf = "\0" * Fiddle::SIZEOF_VOIDP
129
+ ret = NetAPI32.NetWkstaGetInfo(nil, 102, buf)
130
+ if ret != 0
131
+ raise "NetWkstaGetInfo() failed (ret=#{ret})"
132
+ end
133
+ ptr = buf.unpack('j')[0]
134
+ if ptr == 0
135
+ raise "NetWkstaGetInfo() returned a null pointer"
136
+ end
137
+
138
+ data = NetAPI32::WKSTA_INFO_102.new(ptr)
139
+ info = {
140
+ :PlatformID => data.wki102_platform_id,
141
+ :VersionMajor => data.wki102_ver_major,
142
+ :VersionMinor => data.wki102_ver_minor,
143
+ :LoggedOnUsers => data.wki102_logged_on_users
144
+ }
145
+ NetAPI32.NetApiBufferFree(ptr)
146
+ return info
147
+ end
148
+
149
+ def self.GetRegistryInfo()
150
+ info = {}
151
+ pagesize = 0
152
+ Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\Microsoft\Windows NT\CurrentVersion') do |reg|
153
+ info[:ProductName] = reg["ProductName"]
154
+ info[:CurrentBuildNumber] = reg["CurrentBuildNumber"]
155
+ end
156
+ Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management') do |reg|
157
+ for path in reg['ExistingPageFiles', Win32::Registry::REG_MULTI_SZ] do
158
+ pagesize += File.stat(path.gsub("\\??\\", "")).size
159
+ end
160
+ end
161
+ info[:PagingLimitBytes] = pagesize
162
+ return info
163
+ end
164
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-windows-exporter
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Fujimoto Seiji
8
+ - Fukuda Daijiro
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-12-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '13.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '13.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: test-unit
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bindata
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.4'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.4'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fluentd
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 0.14.10
77
+ - - "<"
78
+ - !ruby/object:Gem::Version
79
+ version: '2'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 0.14.10
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: '2'
90
+ description:
91
+ email:
92
+ - fujimoto@clear-code.com
93
+ - fukuda@clear-code.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - LICENSE
99
+ - README.md
100
+ - lib/fluent/plugin/hkey_perf_data_converted_type.rb
101
+ - lib/fluent/plugin/hkey_perf_data_raw_type.rb
102
+ - lib/fluent/plugin/hkey_perf_data_reader.rb
103
+ - lib/fluent/plugin/in_windows_exporter.rb
104
+ - lib/fluent/plugin/test_hpd_reader.rb
105
+ - lib/fluent/plugin/winffi.rb
106
+ homepage: https://github.com/fluent-plugins-nursery/fluent-plugin-windows-exporter
107
+ licenses:
108
+ - Apache-2.0
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubygems_version: 3.0.3
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Fluentd plugin to collect Windows metrics (memory, cpu, network, etc.)
129
+ test_files: []