mirror of
https://github.com/serverless/serverless.git
synced 2026-01-18 14:58:43 +00:00
91 lines
2.9 KiB
JavaScript
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',
|
|
)
|
|
}
|