feat: add Amplitude API key to Docker entrypoint script (#29477)

Co-authored-by: CodingOnStar <hanxujiang@dify.ai>
This commit is contained in:
Coding On Star
2025-12-11 14:44:12 +08:00
committed by GitHub
parent fcadee9413
commit 7344adf65e
7 changed files with 25 additions and 3 deletions

View File

@@ -136,6 +136,7 @@ services:
environment: environment:
CONSOLE_API_URL: ${CONSOLE_API_URL:-} CONSOLE_API_URL: ${CONSOLE_API_URL:-}
APP_API_URL: ${APP_API_URL:-} APP_API_URL: ${APP_API_URL:-}
AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-}
NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-}
SENTRY_DSN: ${WEB_SENTRY_DSN:-} SENTRY_DSN: ${WEB_SENTRY_DSN:-}
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0} NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}

View File

@@ -773,6 +773,7 @@ services:
environment: environment:
CONSOLE_API_URL: ${CONSOLE_API_URL:-} CONSOLE_API_URL: ${CONSOLE_API_URL:-}
APP_API_URL: ${APP_API_URL:-} APP_API_URL: ${APP_API_URL:-}
AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-}
NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-}
SENTRY_DSN: ${WEB_SENTRY_DSN:-} SENTRY_DSN: ${WEB_SENTRY_DSN:-}
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0} NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}

View File

@@ -70,3 +70,6 @@ NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX=false
# The maximum number of tree node depth for workflow # The maximum number of tree node depth for workflow
NEXT_PUBLIC_MAX_TREE_DEPTH=50 NEXT_PUBLIC_MAX_TREE_DEPTH=50
# The api key of amplitude
NEXT_PUBLIC_AMPLITUDE_API_KEY=

View File

@@ -11,13 +11,19 @@ export type IAmplitudeProps = {
sessionReplaySampleRate?: number sessionReplaySampleRate?: number
} }
// Check if Amplitude should be enabled
export const isAmplitudeEnabled = () => {
const apiKey = process.env.NEXT_PUBLIC_AMPLITUDE_API_KEY
return IS_CLOUD_EDITION && !!apiKey
}
const AmplitudeProvider: FC<IAmplitudeProps> = ({ const AmplitudeProvider: FC<IAmplitudeProps> = ({
apiKey = process.env.NEXT_PUBLIC_AMPLITUDE_API_KEY ?? '', apiKey = process.env.NEXT_PUBLIC_AMPLITUDE_API_KEY ?? '',
sessionReplaySampleRate = 1, sessionReplaySampleRate = 1,
}) => { }) => {
useEffect(() => { useEffect(() => {
// Only enable in Saas edition // Only enable in Saas edition with valid API key
if (!IS_CLOUD_EDITION) if (!isAmplitudeEnabled())
return return
// Initialize Amplitude // Initialize Amplitude

View File

@@ -1,2 +1,2 @@
export { default } from './AmplitudeProvider' export { default, isAmplitudeEnabled } from './AmplitudeProvider'
export { resetUser, setUserId, setUserProperties, trackEvent } from './utils' export { resetUser, setUserId, setUserProperties, trackEvent } from './utils'

View File

@@ -1,4 +1,5 @@
import * as amplitude from '@amplitude/analytics-browser' import * as amplitude from '@amplitude/analytics-browser'
import { isAmplitudeEnabled } from './AmplitudeProvider'
/** /**
* Track custom event * Track custom event
@@ -6,6 +7,8 @@ import * as amplitude from '@amplitude/analytics-browser'
* @param eventProperties Event properties (optional) * @param eventProperties Event properties (optional)
*/ */
export const trackEvent = (eventName: string, eventProperties?: Record<string, any>) => { export const trackEvent = (eventName: string, eventProperties?: Record<string, any>) => {
if (!isAmplitudeEnabled())
return
amplitude.track(eventName, eventProperties) amplitude.track(eventName, eventProperties)
} }
@@ -14,6 +17,8 @@ export const trackEvent = (eventName: string, eventProperties?: Record<string, a
* @param userId User ID * @param userId User ID
*/ */
export const setUserId = (userId: string) => { export const setUserId = (userId: string) => {
if (!isAmplitudeEnabled())
return
amplitude.setUserId(userId) amplitude.setUserId(userId)
} }
@@ -22,6 +27,8 @@ export const setUserId = (userId: string) => {
* @param properties User properties * @param properties User properties
*/ */
export const setUserProperties = (properties: Record<string, any>) => { export const setUserProperties = (properties: Record<string, any>) => {
if (!isAmplitudeEnabled())
return
const identifyEvent = new amplitude.Identify() const identifyEvent = new amplitude.Identify()
Object.entries(properties).forEach(([key, value]) => { Object.entries(properties).forEach(([key, value]) => {
identifyEvent.set(key, value) identifyEvent.set(key, value)
@@ -33,5 +40,7 @@ export const setUserProperties = (properties: Record<string, any>) => {
* Reset user (e.g., when user logs out) * Reset user (e.g., when user logs out)
*/ */
export const resetUser = () => { export const resetUser = () => {
if (!isAmplitudeEnabled())
return
amplitude.reset() amplitude.reset()
} }

View File

@@ -25,6 +25,8 @@ export NEXT_PUBLIC_SENTRY_DSN=${SENTRY_DSN}
export NEXT_PUBLIC_SITE_ABOUT=${SITE_ABOUT} export NEXT_PUBLIC_SITE_ABOUT=${SITE_ABOUT}
export NEXT_TELEMETRY_DISABLED=${NEXT_TELEMETRY_DISABLED} export NEXT_TELEMETRY_DISABLED=${NEXT_TELEMETRY_DISABLED}
export NEXT_PUBLIC_AMPLITUDE_API_KEY=${AMPLITUDE_API_KEY}
export NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=${TEXT_GENERATION_TIMEOUT_MS} export NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=${TEXT_GENERATION_TIMEOUT_MS}
export NEXT_PUBLIC_CSP_WHITELIST=${CSP_WHITELIST} export NEXT_PUBLIC_CSP_WHITELIST=${CSP_WHITELIST}
export NEXT_PUBLIC_ALLOW_EMBED=${ALLOW_EMBED} export NEXT_PUBLIC_ALLOW_EMBED=${ALLOW_EMBED}