forked from tg44/nicehash-exporter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
214 lines (191 loc) · 6.16 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
const NicehashJS = require('./nicehash')
const client = require('prom-client')
const Gauge = client.Gauge
const express = require('express')
require('dotenv').config()
// settings
const port = process.env.PORT || 3000
const refreshRateSeconds = process.env.REFRESH_RATE_SECONDS || 30
const nodeMetricsPrefix = process.env.NODDE_METRICS_PREFIX || ''
const prefix = process.env.NH_METRICS_PREFIX || 'nh_'
const apiKey = process.env.NH_API_KEY
const apiSecret = process.env.NH_API_SECRET
const organizationId = process.env.NH_API_ORG_ID
const rates = process.env.NH_RATES ? process.env.NH_RATES.split(',') : ['BTCUSDC', 'BTCEURS']
if(!apiKey || !apiSecret || !organizationId) {
console.log("You need an api key and an api secret and orgId!")
console.log("https://www.nicehash.com/my/settings/keys")
return 1
}
// init libs
const app = express()
const collectDefaultMetrics = client.collectDefaultMetrics;
collectDefaultMetrics({prefix: nodeMetricsPrefix})
const register = client.register;
const nhClient = new NicehashJS({
apiKey,
apiSecret,
organizationId
});
// metrics
const totalRigs = new Gauge({
name: prefix + 'total_rigs',
help: 'Number of rigs you own'
});
const totalDevices = new Gauge({
name: prefix +'total_devices',
help: 'Number of devices in the rigs'
});
const totalProfitability = new Gauge({
name: prefix +'total_profitability',
help: 'totalProfitability'
});
const unpaidAmount = new Gauge({
name: prefix +'unpaid_amount',
help: 'unpaidAmount'
});
const totalBtc = new Gauge({
name: prefix +'total_btc',
help: 'totalBtc',
});
const rateGauges = rates.map(r => {
return {
rate: r,
gauge: new Gauge({
name: prefix + r.toLowerCase() + '_rate',
help: r + ' rate',
})
}
});
const minerStatuses = new Gauge({
name: prefix +'miner_statuses',
help: 'minerStatuses',
labelNames: ['status'],
});
const devicesStatuses = new Gauge({
name: prefix +'devices_statuses',
help: 'devicesStatuses',
labelNames: ['status'],
});
const deviceTemp = new Gauge({
name: prefix +'device_temp',
help: 'deviceTemp',
labelNames: ['rig_name', 'device_name', 'device_id', 'device_type'],
});
const deviceLoad = new Gauge({
name: prefix +'device_load',
help: 'deviceLoad',
labelNames: ['rig_name', 'device_name', 'device_id', 'device_type'],
});
const devicePower = new Gauge({
name: prefix +'device_power',
help: 'devicePower',
labelNames: ['rig_name', 'device_name', 'device_id', 'device_type'],
});
const deviceSpeed = new Gauge({
name: prefix +'device_speed',
help: 'deviceSpeed',
labelNames: ['rig_name', 'device_name', 'device_id', 'device_type', 'algo', 'suffix'],
});
const rigStatusTime = new Gauge({
name: prefix +'rig_status_time',
help: 'rigStatusTime',
labelNames: ['rig_name', 'rig_id'],
});
const rigJoinTime = new Gauge({
name: prefix +'rig_join_time',
help: 'rigJoinTime',
labelNames: ['rig_name', 'rig_id'],
});
const deviceStatusInfo = new Gauge({
name: prefix +'device_status_info',
help: 'deviceStatusInfo',
labelNames: ['rig_name', 'rig_softwareversions', 'device_name', 'device_id', 'device_type', 'status'],
});
async function refreshMetrics() {
minerStatuses.reset()
devicesStatuses.reset()
rigStatusTime.reset()
rigJoinTime.reset()
deviceTemp.reset()
deviceLoad.reset()
devicePower.reset()
deviceStatusInfo.reset()
deviceSpeed.reset()
try {
const rawResponse = await nhClient.getMiningRigs()
const data = rawResponse.data
//console.log(data)
totalRigs.set(data.totalRigs)
totalDevices.set(data.totalDevices)
totalProfitability.set(data.totalProfitability)
unpaidAmount.set(+data.unpaidAmount)
Object.keys(data.minerStatuses).forEach(k => minerStatuses.labels(k).set(data.minerStatuses[k]))
Object.keys(data.devicesStatuses).forEach(k => devicesStatuses.labels(k).set(data.devicesStatuses[k]))
data.miningRigs.forEach(rig => {
rigStatusTime.labels(rig.name, rig.rigId).set(rig.statusTime)
try {
rigJoinTime.labels(rig.name, rig.rigId).set(rig.joinTime)
} catch (e) {}
(rig.devices || []).forEach(device => {
try {
deviceTemp.labels(rig.name, device.name, device.id, device.deviceType.enumName).set(device.temperature)
deviceLoad.labels(rig.name, device.name, device.id, device.deviceType.enumName).set(device.load)
devicePower.labels(rig.name, device.name, device.id, device.deviceType.enumName).set(device.powerUsage)
deviceStatusInfo.labels(rig.name, rig.softwareVersions, device.name, device.id, device.deviceType.enumName, device.status.enumName).set(1)
device.speeds.forEach(speed => {
//console.log(speed)
deviceSpeed.labels(rig.name, device.name, device.id, device.deviceType.enumName, speed.algorithm, speed.displaySuffix).set(+speed.speed)
})
} catch (e) {
console.log("there was an error parsing " + JSON.stringify(device) + " with ", e)
}
})
})
} catch (e) {
console.log("there was an error on request1 ", e)
}
try {
const rawResponse2 = await nhClient.getWallets()
const data2 = rawResponse2.data
//console.log(data2)
totalBtc.set(+data2.total.totalBalance)
//fiatRate.set(data2.totalBalance)
} catch (e) {
console.log("there was an error on request2 ", e)
}
try {
const rawResponse3 = await nhClient.getExchangeRates()
const data3 = rawResponse3.data
//console.log(data3)
rateGauges.forEach( r => {
try {
r.gauge.set(+data3[r.rate])
} catch (e) {
console.log(`given rate ${r.rate} not found in ${data3}`)
}
})
} catch (e) {
console.log("there was an error on request3 ", e)
}
}
// APIS
app.get('/', (req, res) => {
res.send('This is an empty index, you want to go to the <a href="/metrics">metrics</a> endpoint for data!')
})
app.get('/metrics', async (req, res) => {
try {
res.set('Content-Type', register.contentType);
res.end(await register.metrics());
} catch (ex) {
res.status(500).end(ex);
}
})
// Start the things
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
refreshMetrics()
setInterval(() => {
refreshMetrics();
}, refreshRateSeconds*1000);