Re-use LN stats importer code to log daily LN stats
This commit is contained in:
		
							parent
							
								
									91ada9ce75
								
							
						
					
					
						commit
						2daf94f65a
					
				@ -56,116 +56,21 @@ class LightningStatsUpdater {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private async $runTasks(): Promise<void> {
 | 
					  private async $runTasks(): Promise<void> {
 | 
				
			||||||
    await this.$logLightningStatsDaily();
 | 
					    await this.$logStatsDaily();
 | 
				
			||||||
    await this.$logNodeStatsDaily();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setTimeout(() => {
 | 
					    setTimeout(() => {
 | 
				
			||||||
      this.$runTasks();
 | 
					      this.$runTasks();
 | 
				
			||||||
    }, this.timeUntilMidnight());
 | 
					    }, this.timeUntilMidnight());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private async $logLightningStatsDaily() {
 | 
					  private async $logStatsDaily(): Promise<void> {
 | 
				
			||||||
    try {
 | 
					    const date = new Date();
 | 
				
			||||||
      logger.info(`Running lightning daily stats log...`);
 | 
					    this.setDateMidnight(date);
 | 
				
			||||||
 | 
					    date.setUTCHours(24);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const networkGraph = await lightningApi.$getNetworkGraph();
 | 
					    logger.info(`Running lightning daily stats log...`);
 | 
				
			||||||
      let total_capacity = 0;
 | 
					    const networkGraph = await lightningApi.$getNetworkGraph();
 | 
				
			||||||
      for (const channel of networkGraph.edges) {
 | 
					    LightningStatsImporter.computeNetworkStats(date.getTime(), networkGraph);
 | 
				
			||||||
        if (channel.capacity) {
 | 
					 | 
				
			||||||
          total_capacity += parseInt(channel.capacity);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      let clearnetNodes = 0;
 | 
					 | 
				
			||||||
      let torNodes = 0;
 | 
					 | 
				
			||||||
      let unannouncedNodes = 0;
 | 
					 | 
				
			||||||
      for (const node of networkGraph.nodes) {
 | 
					 | 
				
			||||||
        for (const socket of node.addresses) {
 | 
					 | 
				
			||||||
          const hasOnion = socket.addr.indexOf('.onion') !== -1;
 | 
					 | 
				
			||||||
          if (hasOnion) {
 | 
					 | 
				
			||||||
            torNodes++;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          const hasClearnet = [4, 6].includes(isIP(socket.split(':')[0]));
 | 
					 | 
				
			||||||
          if (hasClearnet) {
 | 
					 | 
				
			||||||
            clearnetNodes++;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (node.addresses.length === 0) {
 | 
					 | 
				
			||||||
          unannouncedNodes++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const channelStats = await channelsApi.$getChannelsStats();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const query = `INSERT INTO lightning_stats(
 | 
					 | 
				
			||||||
          added,
 | 
					 | 
				
			||||||
          channel_count,
 | 
					 | 
				
			||||||
          node_count,
 | 
					 | 
				
			||||||
          total_capacity,
 | 
					 | 
				
			||||||
          tor_nodes,
 | 
					 | 
				
			||||||
          clearnet_nodes,
 | 
					 | 
				
			||||||
          unannounced_nodes,
 | 
					 | 
				
			||||||
          avg_capacity,
 | 
					 | 
				
			||||||
          avg_fee_rate,
 | 
					 | 
				
			||||||
          avg_base_fee_mtokens,
 | 
					 | 
				
			||||||
          med_capacity,
 | 
					 | 
				
			||||||
          med_fee_rate,
 | 
					 | 
				
			||||||
          med_base_fee_mtokens
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        VALUES (NOW() - INTERVAL 1 DAY, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await DB.query(query, [
 | 
					 | 
				
			||||||
        networkGraph.edges.length,
 | 
					 | 
				
			||||||
        networkGraph.nodes.length,
 | 
					 | 
				
			||||||
        total_capacity,
 | 
					 | 
				
			||||||
        torNodes,
 | 
					 | 
				
			||||||
        clearnetNodes,
 | 
					 | 
				
			||||||
        unannouncedNodes,
 | 
					 | 
				
			||||||
        channelStats.avgCapacity,
 | 
					 | 
				
			||||||
        channelStats.avgFeeRate,
 | 
					 | 
				
			||||||
        channelStats.avgBaseFee,
 | 
					 | 
				
			||||||
        channelStats.medianCapacity,
 | 
					 | 
				
			||||||
        channelStats.medianFeeRate,
 | 
					 | 
				
			||||||
        channelStats.medianBaseFee,
 | 
					 | 
				
			||||||
      ]);
 | 
					 | 
				
			||||||
      logger.info(`Lightning daily stats done.`);
 | 
					 | 
				
			||||||
    } catch (e) {
 | 
					 | 
				
			||||||
      logger.err('$logLightningStatsDaily() error: ' + (e instanceof Error ? e.message : e));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private async $logNodeStatsDaily() {
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
      logger.info(`Running daily node stats update...`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const query = `
 | 
					 | 
				
			||||||
        SELECT nodes.public_key, c1.channels_count_left, c2.channels_count_right, c1.channels_capacity_left,
 | 
					 | 
				
			||||||
          c2.channels_capacity_right
 | 
					 | 
				
			||||||
        FROM nodes
 | 
					 | 
				
			||||||
        LEFT JOIN (
 | 
					 | 
				
			||||||
          SELECT node1_public_key, COUNT(id) AS channels_count_left, SUM(capacity) AS channels_capacity_left
 | 
					 | 
				
			||||||
          FROM channels
 | 
					 | 
				
			||||||
          WHERE channels.status = 1
 | 
					 | 
				
			||||||
          GROUP BY node1_public_key
 | 
					 | 
				
			||||||
        ) c1 ON c1.node1_public_key = nodes.public_key
 | 
					 | 
				
			||||||
        LEFT JOIN (
 | 
					 | 
				
			||||||
          SELECT node2_public_key, COUNT(id) AS channels_count_right, SUM(capacity) AS channels_capacity_right
 | 
					 | 
				
			||||||
          FROM channels WHERE channels.status = 1 GROUP BY node2_public_key
 | 
					 | 
				
			||||||
        ) c2 ON c2.node2_public_key = nodes.public_key
 | 
					 | 
				
			||||||
      `;
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      const [nodes]: any = await DB.query(query);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (const node of nodes) {
 | 
					 | 
				
			||||||
        await DB.query(
 | 
					 | 
				
			||||||
          `INSERT INTO node_stats(public_key, added, capacity, channels) VALUES (?, NOW() - INTERVAL 1 DAY, ?, ?)`,
 | 
					 | 
				
			||||||
          [node.public_key, (parseInt(node.channels_capacity_left || 0, 10)) + (parseInt(node.channels_capacity_right || 0, 10)),
 | 
					 | 
				
			||||||
            node.channels_count_left + node.channels_count_right]);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      logger.info('Daily node stats has updated.');
 | 
					 | 
				
			||||||
    } catch (e) {
 | 
					 | 
				
			||||||
      logger.err('$logNodeStatsDaily() error: ' + (e instanceof Error ? e.message : e));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -36,6 +36,8 @@ class LightningStatsImporter {
 | 
				
			|||||||
  latestNodeCount = 1; // Ignore gap in the data
 | 
					  latestNodeCount = 1; // Ignore gap in the data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async $run(): Promise<void> {
 | 
					  async $run(): Promise<void> {
 | 
				
			||||||
 | 
					    logger.info(`Importing historical lightning stats`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // const [channels]: any[] = await DB.query('SELECT short_id from channels;');
 | 
					    // const [channels]: any[] = await DB.query('SELECT short_id from channels;');
 | 
				
			||||||
    // logger.info('Caching funding txs for currently existing channels');
 | 
					    // logger.info('Caching funding txs for currently existing channels');
 | 
				
			||||||
    // await fundingTxFetcher.$fetchChannelsFundingTxs(channels.map(channel => channel.short_id));
 | 
					    // await fundingTxFetcher.$fetchChannelsFundingTxs(channels.map(channel => channel.short_id));
 | 
				
			||||||
@ -106,7 +108,7 @@ class LightningStatsImporter {
 | 
				
			|||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Generate LN network stats for one day
 | 
					   * Generate LN network stats for one day
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  async computeNetworkStats(timestamp: number, networkGraph): Promise<void> {
 | 
					  public async computeNetworkStats(timestamp: number, networkGraph): Promise<void> {
 | 
				
			||||||
    // Node counts and network shares
 | 
					    // Node counts and network shares
 | 
				
			||||||
    let clearnetNodes = 0;
 | 
					    let clearnetNodes = 0;
 | 
				
			||||||
    let torNodes = 0;
 | 
					    let torNodes = 0;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user