mirror of
https://github.com/balena-io/etcher.git
synced 2025-04-26 00:07:17 +00:00
124 lines
3.1 KiB
TypeScript
124 lines
3.1 KiB
TypeScript
/*
|
|
* Copyright 2016 balena.io
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import * as _ from 'lodash';
|
|
import * as resinCorvus from 'resin-corvus/browser';
|
|
|
|
import * as packageJSON from '../../../../package.json';
|
|
import { getConfig, hasProps } from '../../../shared/utils';
|
|
import * as settings from '../models/settings';
|
|
|
|
const sentryToken =
|
|
settings.get('analyticsSentryToken') ||
|
|
_.get(packageJSON, ['analytics', 'sentry', 'token']);
|
|
const mixpanelToken =
|
|
settings.get('analyticsMixpanelToken') ||
|
|
_.get(packageJSON, ['analytics', 'mixpanel', 'token']);
|
|
|
|
const configUrl =
|
|
settings.get('configUrl') || 'https://balena.io/etcher/static/config.json';
|
|
|
|
const DEFAULT_PROBABILITY = 0.1;
|
|
|
|
const services = {
|
|
sentry: sentryToken,
|
|
mixpanel: mixpanelToken,
|
|
};
|
|
|
|
resinCorvus.install({
|
|
services,
|
|
options: {
|
|
release: packageJSON.version,
|
|
shouldReport: () => {
|
|
return settings.get('errorReporting');
|
|
},
|
|
mixpanelDeferred: true,
|
|
},
|
|
});
|
|
|
|
let mixpanelSample = DEFAULT_PROBABILITY;
|
|
|
|
/**
|
|
* @summary Init analytics configurations
|
|
*/
|
|
async function initConfig() {
|
|
let validatedConfig = null;
|
|
try {
|
|
const config = await getConfig(configUrl);
|
|
const mixpanel = _.get(config, ['analytics', 'mixpanel'], {});
|
|
mixpanelSample = mixpanel.probability || DEFAULT_PROBABILITY;
|
|
if (isClientEligible(mixpanelSample)) {
|
|
validatedConfig = validateMixpanelConfig(mixpanel);
|
|
}
|
|
} catch (err) {
|
|
resinCorvus.logException(err);
|
|
}
|
|
resinCorvus.setConfigs({
|
|
mixpanel: validatedConfig,
|
|
});
|
|
}
|
|
|
|
initConfig();
|
|
|
|
/**
|
|
* @summary Check that the client is eligible for analytics
|
|
*/
|
|
function isClientEligible(probability: number) {
|
|
return Math.random() < probability;
|
|
}
|
|
|
|
/**
|
|
* @summary Check that config has at least HTTP_PROTOCOL and api_host
|
|
*/
|
|
function validateMixpanelConfig(config: {
|
|
api_host?: string;
|
|
HTTP_PROTOCOL?: string;
|
|
}) {
|
|
const mixpanelConfig = {
|
|
api_host: 'https://api.mixpanel.com',
|
|
};
|
|
if (hasProps(config, ['HTTP_PROTOCOL', 'api_host'])) {
|
|
mixpanelConfig.api_host = `${config.HTTP_PROTOCOL}://${config.api_host}`;
|
|
}
|
|
return mixpanelConfig;
|
|
}
|
|
|
|
/**
|
|
* @summary Log a debug message
|
|
*
|
|
* @description
|
|
* This function sends the debug message to error reporting services.
|
|
*/
|
|
export const logDebug = resinCorvus.logDebug;
|
|
|
|
/**
|
|
* @summary Log an event
|
|
*
|
|
* @description
|
|
* This function sends the debug message to product analytics services.
|
|
*/
|
|
export function logEvent(message: string, data: any) {
|
|
resinCorvus.logEvent(message, { ...data, sample: mixpanelSample });
|
|
}
|
|
|
|
/**
|
|
* @summary Log an exception
|
|
*
|
|
* @description
|
|
* This function logs an exception to error reporting services.
|
|
*/
|
|
export const logException = resinCorvus.logException;
|