91 lines
2.9 KiB
JavaScript

import { ObservabilityProvider } from '@serverlessinc/sf-core/src/lib/observability/index.js'
import ServerlessError from '@serverlessinc/sf-core/src/utils/errors/serverlessError.js'
import yaml from 'js-yaml'
/**
* Checks if observability is configured, which may or may not be enabled
* @param {Object} configurationInput The configuration input object
* @param {string} stageName The current stage name
* @returns {string|null} The configured observability provider or null
*/
export function determineObservabilityProviderFromConfig(
configurationInput,
stageName,
) {
let observabilityProvider = null
if (!configurationInput.stages) {
return null
}
const stageObservability = configurationInput.stages[stageName]?.observability
const defaultObservability = configurationInput.stages.default?.observability
observabilityProvider = determineStageSpecificObservabilityProvider(
stageObservability,
configurationInput.app,
)
if (!observabilityProvider) {
observabilityProvider = determineStageSpecificObservabilityProvider(
defaultObservability,
configurationInput.app,
)
}
return observabilityProvider
}
/**
* Returns the observability provider based on the observability configuration
* @param {boolean|string|Object} observability The observability configuration
* @param {Object} app The app name
* @returns {string|null} The observability provider
*/
function determineStageSpecificObservabilityProvider(observability, app) {
if (observability === null || observability === undefined) return null
const knownProviders = {
axiom: ObservabilityProvider.AXIOM,
dashboard: ObservabilityProvider.DASHBOARD,
disabled: ObservabilityProvider.DISABLED,
}
let providerName
if (typeof observability === 'string') {
providerName = observability.toLowerCase()
} else if (typeof observability === 'boolean') {
if (!app) {
throw new ServerlessError(
'To instrument your service, you must set the "app" property in your config file.',
'OBSERVABILITY_APP_NOT_SET',
)
}
if (observability === true) {
providerName = ObservabilityProvider.DASHBOARD
} else {
providerName = ObservabilityProvider.DISABLED
}
} else if (
typeof observability === 'object' &&
typeof observability.provider === 'string'
) {
providerName = observability.provider.toLowerCase()
}
if (providerName) {
const provider = knownProviders[providerName] || null
if (!provider) {
throw new ServerlessError(
`Unknown observability provider: ${providerName}`,
'UNKNOWN_OBSERVABILITY_PROVIDER',
)
}
return provider
}
throw new ServerlessError(
`Invalid observability configuration. Expected a boolean, string or an object with a "provider" property. Received: ${yaml.dump(observability)}`,
'INVALID_OBSERVABILITY_CONFIGURATION',
)
}