fastcheck/server/src/config/elasticsearch-mappings.ts
2026-04-08 13:58:46 -04:00

387 lines
6.6 KiB
TypeScript

// Elasticsearch index mappings for different log types
export interface ElasticsearchMapping {
mappings: {
properties: Record<string, any>;
};
settings?: {
number_of_shards?: number;
number_of_replicas?: number;
index?: Record<string, any>;
};
}
// Common properties shared across all log types
const commonProperties = {
'@timestamp': {
type: 'date',
format: 'strict_date_optional_time||epoch_millis'
},
level: {
type: 'keyword'
},
message: {
type: 'text',
analyzer: 'standard'
},
service: {
type: 'keyword'
},
environment: {
type: 'keyword'
},
logType: {
type: 'keyword'
},
userId: {
type: 'keyword'
},
tenantId: {
type: 'keyword'
},
requestId: {
type: 'keyword'
}
};
// Sheriff API specific properties
const sheriffApiProperties = {
...commonProperties,
callName: {
type: 'keyword'
},
method: {
type: 'keyword'
},
url: {
type: 'text',
fields: {
keyword: {
type: 'keyword',
ignore_above: 256
}
}
},
statusCode: {
type: 'integer'
},
responseTime: {
type: 'integer'
},
rut: {
type: 'keyword'
},
logId: {
type: 'keyword'
},
success: {
type: 'boolean'
},
errorMessage: {
type: 'text'
},
requestPayload: {
type: 'object',
enabled: false
},
responseData: {
type: 'object',
enabled: false
}
};
// HTTP Request logs mapping
export const httpRequestMapping: ElasticsearchMapping = {
mappings: {
properties: {
...commonProperties,
type: {
type: 'keyword'
},
method: {
type: 'keyword'
},
url: {
type: 'text',
fields: {
keyword: {
type: 'keyword',
ignore_above: 256
}
}
},
statusCode: {
type: 'integer'
},
duration: {
type: 'integer'
},
ip: {
type: 'ip'
},
userAgent: {
type: 'text',
fields: {
keyword: {
type: 'keyword',
ignore_above: 512
}
}
}
}
},
settings: {
number_of_shards: 1,
number_of_replicas: 1,
index: {
refresh_interval: '5s'
}
}
};
// Sheriff API calls mapping
export const sheriffApiMapping: ElasticsearchMapping = {
mappings: {
properties: sheriffApiProperties
},
settings: {
number_of_shards: 1,
number_of_replicas: 0,
index: {
refresh_interval: '5s'
}
}
};
// Business Event logs mapping
export const businessEventMapping: ElasticsearchMapping = {
mappings: {
properties: {
...commonProperties,
type: {
type: 'keyword'
},
event: {
type: 'keyword'
},
data: {
type: 'object',
dynamic: true
},
// Additional fields for business events
entityType: {
type: 'keyword'
},
entityId: {
type: 'keyword'
},
action: {
type: 'keyword'
},
result: {
type: 'keyword'
},
metadata: {
type: 'object',
dynamic: true
}
}
},
settings: {
number_of_shards: 1,
number_of_replicas: 1,
index: {
refresh_interval: '10s'
}
}
};
// System Error logs mapping
export const systemErrorMapping: ElasticsearchMapping = {
mappings: {
properties: {
...commonProperties,
type: {
type: 'keyword'
},
error: {
properties: {
name: {
type: 'keyword'
},
message: {
type: 'text',
analyzer: 'standard'
},
stack: {
type: 'text',
index: false
}
}
},
context: {
type: 'keyword'
},
// Additional error-specific fields
severity: {
type: 'keyword'
},
component: {
type: 'keyword'
},
operation: {
type: 'keyword'
},
errorCode: {
type: 'keyword'
}
}
},
settings: {
number_of_shards: 1,
number_of_replicas: 1,
index: {
refresh_interval: '5s'
}
}
};
// General logs mapping
export const generalMapping: ElasticsearchMapping = {
mappings: {
properties: {
...commonProperties,
// Dynamic mapping for flexible general logs
metadata: {
type: 'object',
dynamic: true
},
tags: {
type: 'keyword'
},
category: {
type: 'keyword'
}
}
},
settings: {
number_of_shards: 1,
number_of_replicas: 1,
index: {
refresh_interval: '30s'
}
}
};
// Export all mappings
export const indexMappings = {
httpRequest: httpRequestMapping,
businessEvent: businessEventMapping,
systemError: systemErrorMapping,
general: generalMapping,
sheriffApi: sheriffApiMapping
};
// Index lifecycle policies
export const indexLifecyclePolicies = {
httpRequest: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_size: '50gb',
max_age: '30d'
}
}
},
warm: {
min_age: '30d',
actions: {
allocate: {
number_of_replicas: 0
}
}
},
delete: {
min_age: '90d'
}
}
}
},
businessEvent: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_size: '10gb',
max_age: '7d'
}
}
},
warm: {
min_age: '7d',
actions: {
allocate: {
number_of_replicas: 0
}
}
},
delete: {
min_age: '365d'
}
}
}
},
systemError: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_size: '5gb',
max_age: '7d'
}
}
},
warm: {
min_age: '7d',
actions: {
allocate: {
number_of_replicas: 1
}
}
},
delete: {
min_age: '180d'
}
}
}
},
general: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_size: '20gb',
max_age: '30d'
}
}
},
warm: {
min_age: '30d',
actions: {
allocate: {
number_of_replicas: 0
}
}
},
delete: {
min_age: '60d'
}
}
}
}
};