fix(core): update
This commit is contained in:
		
							
								
								
									
										24
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								package.json
									
									
									
									
									
								
							@@ -14,20 +14,20 @@
 | 
				
			|||||||
    "buildDocs": "tsdoc"
 | 
					    "buildDocs": "tsdoc"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@gitzone/tsbuild": "^2.1.66",
 | 
					    "@git.zone/tsbuild": "^2.1.70",
 | 
				
			||||||
    "@gitzone/tsrun": "^1.2.42",
 | 
					    "@git.zone/tsrun": "^1.2.46",
 | 
				
			||||||
    "@gitzone/tstest": "^1.0.74",
 | 
					    "@git.zone/tstest": "^1.0.80",
 | 
				
			||||||
    "@pushrocks/qenv": "^5.0.2",
 | 
					    "@push.rocks/qenv": "^6.0.2",
 | 
				
			||||||
    "@pushrocks/tapbundle": "^5.0.8",
 | 
					    "@push.rocks/tapbundle": "^5.0.15",
 | 
				
			||||||
    "@types/node": "^20.3.3"
 | 
					    "@types/node": "^20.5.7"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@elastic/elasticsearch": "7.17.11-patch.1",
 | 
					    "@elastic/elasticsearch": "8.9.0",
 | 
				
			||||||
    "@pushrocks/lik": "^6.0.2",
 | 
					    "@push.rocks/lik": "^6.0.5",
 | 
				
			||||||
    "@pushrocks/smartdelay": "^3.0.1",
 | 
					    "@push.rocks/smartdelay": "^3.0.5",
 | 
				
			||||||
    "@pushrocks/smartlog-interfaces": "^3.0.0",
 | 
					    "@push.rocks/smartlog-interfaces": "^3.0.0",
 | 
				
			||||||
    "@pushrocks/smartpromise": "^4.0.2",
 | 
					    "@push.rocks/smartpromise": "^4.0.2",
 | 
				
			||||||
    "@pushrocks/smarttime": "^4.0.1"
 | 
					    "@push.rocks/smarttime": "^4.0.5"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "files": [
 | 
					  "files": [
 | 
				
			||||||
    "ts/**/*",
 | 
					    "ts/**/*",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2203
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2203
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { expect, tap } from '@pushrocks/tapbundle';
 | 
					import { expect, tap } from '@push.rocks/tapbundle';
 | 
				
			||||||
import { Qenv } from '@pushrocks/qenv';
 | 
					import { Qenv } from '@push.rocks/qenv';
 | 
				
			||||||
import * as elasticsearch from '../ts/index.js';
 | 
					import * as elasticsearch from '../ts/index.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let testElasticLog: elasticsearch.ElsSmartlogDestination<any>;
 | 
					let testElasticLog: elasticsearch.ElsSmartlogDestination<any>;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,6 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
export const commitinfo = {
 | 
					export const commitinfo = {
 | 
				
			||||||
  name: '@apiclient.xyz/elasticsearch',
 | 
					  name: '@apiclient.xyz/elasticsearch',
 | 
				
			||||||
  version: '2.0.6',
 | 
					  version: '2.0.7',
 | 
				
			||||||
  description: 'log to elasticsearch in a kibana compatible format'
 | 
					  description: 'log to elasticsearch in a kibana compatible format'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ export class ElasticDoc {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private async ensureIndexExists(doc: any) {
 | 
					  private async ensureIndexExists(doc: any) {
 | 
				
			||||||
    if (!this.indexInitialized) {
 | 
					    if (!this.indexInitialized) {
 | 
				
			||||||
      const { body: indexExists } = await this.client.indices.exists({ index: this.index });
 | 
					      const indexExists = await this.client.indices.exists({ index: this.index });
 | 
				
			||||||
      if (!indexExists) {
 | 
					      if (!indexExists) {
 | 
				
			||||||
        const mappings = this.createMappingsFromDoc(doc);
 | 
					        const mappings = this.createMappingsFromDoc(doc);
 | 
				
			||||||
        await this.client.indices.create({
 | 
					        await this.client.indices.create({
 | 
				
			||||||
@@ -81,7 +81,7 @@ export class ElasticDoc {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
        // If the search query succeeded, the index exists.
 | 
					        // If the search query succeeded, the index exists.
 | 
				
			||||||
        const hit = response.body.hits.hits[0];
 | 
					        const hit = response.hits.hits[0];
 | 
				
			||||||
        this.latestTimestamp = hit?._source?.['@timestamp'] || null;
 | 
					        this.latestTimestamp = hit?._source?.['@timestamp'] || null;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
        if (this.latestTimestamp) {
 | 
					        if (this.latestTimestamp) {
 | 
				
			||||||
@@ -137,11 +137,11 @@ export class ElasticDoc {
 | 
				
			|||||||
      size: this.BATCH_SIZE,
 | 
					      size: this.BATCH_SIZE,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
      response.body.hits.hits.forEach((hit: any) => allDocIds.push(hit._id));
 | 
					      response.hits.hits.forEach((hit: any) => allDocIds.push(hit._id));
 | 
				
			||||||
      if (!response.body.hits.hits.length) {
 | 
					      if (!response.hits.hits.length) {
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      response = await this.client.scroll({ scroll_id: response.body._scroll_id, scroll: '1m' });
 | 
					      response = await this.client.scroll({ scroll_id: response._scroll_id, scroll: '1m' });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (const docId of allDocIds) {
 | 
					    for (const docId of allDocIds) {
 | 
				
			||||||
@@ -170,7 +170,7 @@ export class ElasticDoc {
 | 
				
			|||||||
  async takeSnapshot(processIterator: SnapshotProcessor) {
 | 
					  async takeSnapshot(processIterator: SnapshotProcessor) {
 | 
				
			||||||
    const snapshotIndex = `${this.index}_snapshots`;
 | 
					    const snapshotIndex = `${this.index}_snapshots`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const { body: indexExists } = await this.client.indices.exists({ index: snapshotIndex });
 | 
					    const indexExists = await this.client.indices.exists({ index: snapshotIndex });
 | 
				
			||||||
    if (!indexExists) {
 | 
					    if (!indexExists) {
 | 
				
			||||||
      await this.client.indices.create({
 | 
					      await this.client.indices.create({
 | 
				
			||||||
        index: snapshotIndex,
 | 
					        index: snapshotIndex,
 | 
				
			||||||
@@ -199,7 +199,7 @@ export class ElasticDoc {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private async getLastSnapshot(): Promise<ISnapshot | null> {
 | 
					  private async getLastSnapshot(): Promise<ISnapshot | null> {
 | 
				
			||||||
    const snapshotIndex = `${this.index}_snapshots`;
 | 
					    const snapshotIndex = `${this.index}_snapshots`;
 | 
				
			||||||
    const { body: indexExists } = await this.client.indices.exists({ index: snapshotIndex });
 | 
					    const indexExists = await this.client.indices.exists({ index: snapshotIndex });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!indexExists) {
 | 
					    if (!indexExists) {
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
@@ -211,11 +211,12 @@ export class ElasticDoc {
 | 
				
			|||||||
      size: 1,
 | 
					      size: 1,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (response.body.hits.hits.length > 0) {
 | 
					    if (response.hits.hits.length > 0) {
 | 
				
			||||||
      const hit = response.body.hits.hits[0];
 | 
					      const hit = response.hits.hits[0];
 | 
				
			||||||
 | 
					      console.log(hit);
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
        date: hit._source.date,
 | 
					        date: hit._source['date'],
 | 
				
			||||||
        aggregationData: hit._source.aggregationData,
 | 
					        aggregationData: hit._source['aggregationData'],
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
@@ -229,15 +230,15 @@ export class ElasticDoc {
 | 
				
			|||||||
      size: this.BATCH_SIZE,
 | 
					      size: this.BATCH_SIZE,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
      for (const hit of response.body.hits.hits) {
 | 
					      for (const hit of response.hits.hits) {
 | 
				
			||||||
        yield hit._source;
 | 
					        yield hit._source;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!response.body.hits.hits.length) {
 | 
					      if (!response.hits.hits.length) {
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      response = await this.client.scroll({ scroll_id: response.body._scroll_id, scroll: '1m' });
 | 
					      response = await this.client.scroll({ scroll_id: response._scroll_id, scroll: '1m' });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import * as plugins from './els.plugins.js';
 | 
					import * as plugins from './els.plugins.js';
 | 
				
			||||||
import { ElsSmartlogDestination } from './els.classes.smartlogdestination.js';
 | 
					import { ElsSmartlogDestination } from './els.classes.smartlogdestination.js';
 | 
				
			||||||
import { type ILogPackage } from '@pushrocks/smartlog-interfaces';
 | 
					import { type ILogPackage } from '@push.rocks/smartlog-interfaces';
 | 
				
			||||||
import { Stringmap } from '@pushrocks/lik';
 | 
					import { Stringmap } from '@push.rocks/lik';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class ElasticIndex {
 | 
					export class ElasticIndex {
 | 
				
			||||||
  private stringmap = new Stringmap();
 | 
					  private stringmap = new Stringmap();
 | 
				
			||||||
@@ -18,7 +18,7 @@ export class ElasticIndex {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const responseArg = await this.elasticSearchRef.client.cat.indices({
 | 
					    const responseArg = await this.elasticSearchRef.client.cat.indices({
 | 
				
			||||||
      format: 'json',
 | 
					      format: 'json',
 | 
				
			||||||
      bytes: 'm',
 | 
					      bytes: 'mb',
 | 
				
			||||||
    }).catch(err => {
 | 
					    }).catch(err => {
 | 
				
			||||||
      console.log(err);
 | 
					      console.log(err);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -27,8 +27,8 @@ export class ElasticIndex {
 | 
				
			|||||||
      throw new Error('Could not get valid response from elastic search');
 | 
					      throw new Error('Could not get valid response from elastic search');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (Array.isArray(responseArg.body)) {
 | 
					    if (Array.isArray(responseArg)) {
 | 
				
			||||||
      const filteredIndices = responseArg.body.filter((indexObjectArg) => {
 | 
					      const filteredIndices = responseArg.filter((indexObjectArg) => {
 | 
				
			||||||
        return indexObjectArg.index.startsWith(prefixArg);
 | 
					        return indexObjectArg.index.startsWith(prefixArg);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      const filteredIndexNames = filteredIndices.map((indexObjectArg) => {
 | 
					      const filteredIndexNames = filteredIndices.map((indexObjectArg) => {
 | 
				
			||||||
@@ -39,8 +39,8 @@ export class ElasticIndex {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let index = null;
 | 
					    let index = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (Array.isArray(responseArg.body)) {
 | 
					    if (Array.isArray(responseArg)) {
 | 
				
			||||||
      index = responseArg.body.find((indexItemArg) => {
 | 
					      index = responseArg.find((indexItemArg) => {
 | 
				
			||||||
        return indexItemArg.index === indexNameArg;
 | 
					        return indexItemArg.index === indexNameArg;
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -55,7 +55,7 @@ export class ElasticIndex {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  public async createNewIndex(indexNameArg: string) {
 | 
					  public async createNewIndex(indexNameArg: string) {
 | 
				
			||||||
    const response = await this.elasticSearchRef.client.indices.create({
 | 
					    const response = await this.elasticSearchRef.client.indices.create({
 | 
				
			||||||
      wait_for_active_shards: '1',
 | 
					      wait_for_active_shards: 1,
 | 
				
			||||||
      index: indexNameArg,
 | 
					      index: indexNameArg,
 | 
				
			||||||
      body: {
 | 
					      body: {
 | 
				
			||||||
        mappings: {
 | 
					        mappings: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,5 @@
 | 
				
			|||||||
// interfaces
 | 
					 | 
				
			||||||
import { Client as ElasticClient } from '@elastic/elasticsearch';
 | 
					import { Client as ElasticClient } from '@elastic/elasticsearch';
 | 
				
			||||||
import type { ILogContext, ILogPackage, ILogDestination } from '@pushrocks/smartlog-interfaces';
 | 
					import type { ILogContext, ILogPackage, ILogDestination } from '@push.rocks/smartlog-interfaces';
 | 
				
			||||||
 | 
					 | 
				
			||||||
// other classes
 | 
					 | 
				
			||||||
import { ElasticScheduler } from './els.classes.elasticscheduler.js';
 | 
					import { ElasticScheduler } from './els.classes.elasticscheduler.js';
 | 
				
			||||||
import { ElasticIndex } from './els.classes.elasticindex.js';
 | 
					import { ElasticIndex } from './els.classes.elasticindex.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,10 +26,6 @@ export class ElsSmartlogDestination<T> {
 | 
				
			|||||||
  public indexPrefix: string;
 | 
					  public indexPrefix: string;
 | 
				
			||||||
  public indexRetention: number;
 | 
					  public indexRetention: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
   * sets up an instance of Elastic log
 | 
					 | 
				
			||||||
   * @param optionsArg
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  constructor(optionsArg: IElasticSearchConstructorOptions) {
 | 
					  constructor(optionsArg: IElasticSearchConstructorOptions) {
 | 
				
			||||||
    this.client = new ElasticClient({
 | 
					    this.client = new ElasticClient({
 | 
				
			||||||
      node: optionsArg.node,
 | 
					      node: optionsArg.node,
 | 
				
			||||||
@@ -40,42 +33,27 @@ export class ElsSmartlogDestination<T> {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
    this.indexPrefix = `${optionsArg.indexPrefix}`;
 | 
					    this.indexPrefix = `${optionsArg.indexPrefix}`;
 | 
				
			||||||
    this.indexRetention = optionsArg.indexRetention;
 | 
					    this.indexRetention = optionsArg.indexRetention;
 | 
				
			||||||
 | 
					    this.setupDataStream();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private async setupDataStream() {
 | 
				
			||||||
 | 
					    // Define an index template
 | 
				
			||||||
 | 
					    await this.client.indices.putIndexTemplate({
 | 
				
			||||||
 | 
					      name: `${this.indexPrefix}_template`,
 | 
				
			||||||
 | 
					      index_patterns: [`${this.indexPrefix}-*`],
 | 
				
			||||||
 | 
					      data_stream: {},
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async log(logPackageArg: ILogPackage, scheduleOverwrite = false) {
 | 
					  public async log(logPackageArg: ILogPackage, scheduleOverwrite = false) {
 | 
				
			||||||
    const now = new Date();
 | 
					    const now = new Date();
 | 
				
			||||||
    const indexToUse = `${this.indexPrefix}-${now.toISOString().split('T')[0]}`;
 | 
					    const indexToUse = `${this.indexPrefix}-data-stream`; // Use data stream name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (this.elasticScheduler.docsScheduled && !scheduleOverwrite) {
 | 
					    if (this.elasticScheduler.docsScheduled && !scheduleOverwrite) {
 | 
				
			||||||
      this.elasticScheduler.scheduleDoc(logPackageArg);
 | 
					      this.elasticScheduler.scheduleDoc(logPackageArg);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Make sure the index is created with a mapping for dynamic JSON
 | 
					 | 
				
			||||||
    const indexExists = await this.client.indices.exists({ index: indexToUse });
 | 
					 | 
				
			||||||
    if (!indexExists.body) {
 | 
					 | 
				
			||||||
      await this.client.indices.create({
 | 
					 | 
				
			||||||
        index: indexToUse,
 | 
					 | 
				
			||||||
        body: {
 | 
					 | 
				
			||||||
          mappings: {
 | 
					 | 
				
			||||||
            properties: {
 | 
					 | 
				
			||||||
              '@timestamp': {
 | 
					 | 
				
			||||||
                type: 'date',
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              logPackageArg: {
 | 
					 | 
				
			||||||
                properties: {
 | 
					 | 
				
			||||||
                  payload: {
 | 
					 | 
				
			||||||
                    type: 'object',
 | 
					 | 
				
			||||||
                    dynamic: true
 | 
					 | 
				
			||||||
                  }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this.client.index(
 | 
					    this.client.index(
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        index: indexToUse,
 | 
					        index: indexToUse,
 | 
				
			||||||
@@ -83,15 +61,6 @@ export class ElsSmartlogDestination<T> {
 | 
				
			|||||||
          '@timestamp': new Date(logPackageArg.timestamp).toISOString(),
 | 
					          '@timestamp': new Date(logPackageArg.timestamp).toISOString(),
 | 
				
			||||||
          ...logPackageArg,
 | 
					          ...logPackageArg,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      (error, response) => {
 | 
					 | 
				
			||||||
        if (error) {
 | 
					 | 
				
			||||||
          console.log('ElasticLog encountered an error:');
 | 
					 | 
				
			||||||
          console.log(error);
 | 
					 | 
				
			||||||
          this.elasticScheduler.addFailedDoc(logPackageArg);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          // console.log(`ElasticLog: ${logPackageArg.message}`);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
import * as elasticsearch from '@elastic/elasticsearch';
 | 
					import * as elasticsearch from '@elastic/elasticsearch';
 | 
				
			||||||
import * as lik from '@pushrocks/lik';
 | 
					import * as lik from '@push.rocks/lik';
 | 
				
			||||||
import * as smartdelay from '@pushrocks/smartdelay';
 | 
					import * as smartdelay from '@push.rocks/smartdelay';
 | 
				
			||||||
import * as smartlogInterfaces from '@pushrocks/smartlog-interfaces';
 | 
					import * as smartlogInterfaces from '@push.rocks/smartlog-interfaces';
 | 
				
			||||||
import * as smartpromise from '@pushrocks/smartpromise';
 | 
					import * as smartpromise from '@push.rocks/smartpromise';
 | 
				
			||||||
import * as smarttime from '@pushrocks/smarttime';
 | 
					import * as smarttime from '@push.rocks/smarttime';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { elasticsearch, lik, smartdelay, smartlogInterfaces, smartpromise, smarttime };
 | 
					export { elasticsearch, lik, smartdelay, smartlogInterfaces, smartpromise, smarttime };
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user