fluent-plugin-windows-exporter 1.0.0

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.
@@ -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: []