fluent-plugin-windows-exporter 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|