|
@@ -0,0 +1,51 @@
|
|
|
+import { Meter } from '@opentelemetry/api'
|
|
|
+
|
|
|
+export class BittorrentTrackerObserversBuilder {
|
|
|
+
|
|
|
+ constructor (private readonly meter: Meter, private readonly trackerServer: any) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ buildObservers () {
|
|
|
+ const activeInfohashes = this.meter.createObservableGauge('peertube_bittorrent_tracker_active_infohashes_total', {
|
|
|
+ description: 'Total active infohashes in the PeerTube BitTorrent Tracker'
|
|
|
+ })
|
|
|
+ const inactiveInfohashes = this.meter.createObservableGauge('peertube_bittorrent_tracker_inactive_infohashes_total', {
|
|
|
+ description: 'Total inactive infohashes in the PeerTube BitTorrent Tracker'
|
|
|
+ })
|
|
|
+ const peers = this.meter.createObservableGauge('peertube_bittorrent_tracker_peers_total', {
|
|
|
+ description: 'Total peers in the PeerTube BitTorrent Tracker'
|
|
|
+ })
|
|
|
+
|
|
|
+ this.meter.addBatchObservableCallback(observableResult => {
|
|
|
+ const infohashes = Object.keys(this.trackerServer.torrents)
|
|
|
+
|
|
|
+ const counters = {
|
|
|
+ activeInfohashes: 0,
|
|
|
+ inactiveInfohashes: 0,
|
|
|
+ peers: 0,
|
|
|
+ uncompletedPeers: 0
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const infohash of infohashes) {
|
|
|
+ const content = this.trackerServer.torrents[infohash]
|
|
|
+
|
|
|
+ const peers = content.peers
|
|
|
+ if (peers.keys.length !== 0) counters.activeInfohashes++
|
|
|
+ else counters.inactiveInfohashes++
|
|
|
+
|
|
|
+ for (const peerId of peers.keys) {
|
|
|
+ const peer = peers.peek(peerId)
|
|
|
+ if (peer == null) return
|
|
|
+
|
|
|
+ counters.peers++
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ observableResult.observe(activeInfohashes, counters.activeInfohashes)
|
|
|
+ observableResult.observe(inactiveInfohashes, counters.inactiveInfohashes)
|
|
|
+ observableResult.observe(peers, counters.peers)
|
|
|
+ }, [ activeInfohashes, inactiveInfohashes, peers ])
|
|
|
+ }
|
|
|
+
|
|
|
+}
|