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.
- checksums.yaml +7 -0
- data/LICENSE +202 -0
- data/README.md +77 -0
- data/lib/fluent/plugin/hkey_perf_data_converted_type.rb +148 -0
- data/lib/fluent/plugin/hkey_perf_data_raw_type.rb +143 -0
- data/lib/fluent/plugin/hkey_perf_data_reader.rb +431 -0
- data/lib/fluent/plugin/in_windows_exporter.rb +882 -0
- data/lib/fluent/plugin/test_hpd_reader.rb +124 -0
- data/lib/fluent/plugin/winffi.rb +164 -0
- metadata +129 -0
@@ -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: []
|