Send metrics event from backend for on chain transaction failures (#6500)

* Send metrics event from backend for on chain transaction failures

* Passes state object to backEndMetaMetricsEvent, and adds getMetaMetricState selector
feature/default_network_editable
Dan J Miller 6 years ago committed by GitHub
parent 0095889408
commit 4fea9d0cc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      app/scripts/controllers/preferences.js
  2. 26
      app/scripts/lib/backend-metametrics.js
  3. 19
      app/scripts/metamask-controller.js
  4. 2
      ui/app/ducks/confirm-transaction/confirm-transaction.duck.js
  5. 4
      ui/app/helpers/utils/metametrics.util.js
  6. 15
      ui/app/selectors/selectors.js

@ -117,6 +117,14 @@ class PreferencesController {
return metaMetricsId return metaMetricsId
} }
getMetaMetricsId () {
return this.store.getState().metaMetricsId
}
getParticipateInMetaMetrics () {
return this.store.getState().participateInMetaMetrics
}
setMetaMetricsSendCount (val) { setMetaMetricsSendCount (val) {
this.store.updateState({ metaMetricsSendCount: val }) this.store.updateState({ metaMetricsSendCount: val })
} }

@ -0,0 +1,26 @@
const {
getMetaMetricState,
} = require('../../../ui/app/selectors/selectors')
const {
sendMetaMetricsEvent,
} = require('../../../ui/app/helpers/utils/metametrics.util')
const inDevelopment = process.env.NODE_ENV === 'development'
const METAMETRICS_TRACKING_URL = inDevelopment
? 'http://www.metamask.io/metametrics'
: 'http://www.metamask.io/metametrics-prod'
function backEndMetaMetricsEvent (metaMaskState, eventData) {
const stateEventData = getMetaMetricState({ metamask: metaMaskState })
if (stateEventData.participateInMetaMetrics) {
sendMetaMetricsEvent({
...stateEventData,
...eventData,
url: METAMETRICS_TRACKING_URL + '/backend',
})
}
}
module.exports = backEndMetaMetricsEvent

@ -54,6 +54,7 @@ const EthQuery = require('eth-query')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const sigUtil = require('eth-sig-util') const sigUtil = require('eth-sig-util')
const { AddressBookController } = require('gaba') const { AddressBookController } = require('gaba')
const backEndMetaMetricsEvent = require('./lib/backend-metametrics')
module.exports = class MetamaskController extends EventEmitter { module.exports = class MetamaskController extends EventEmitter {
@ -190,10 +191,26 @@ module.exports = class MetamaskController extends EventEmitter {
}) })
this.txController.on('newUnapprovedTx', () => opts.showUnapprovedTx()) this.txController.on('newUnapprovedTx', () => opts.showUnapprovedTx())
this.txController.on(`tx:status-update`, (txId, status) => { this.txController.on(`tx:status-update`, async (txId, status) => {
if (status === 'confirmed' || status === 'failed') { if (status === 'confirmed' || status === 'failed') {
const txMeta = this.txController.txStateManager.getTx(txId) const txMeta = this.txController.txStateManager.getTx(txId)
this.platform.showTransactionNotification(txMeta) this.platform.showTransactionNotification(txMeta)
const { txReceipt } = txMeta
const participateInMetaMetrics = this.preferencesController.getParticipateInMetaMetrics()
if (txReceipt && txReceipt.status === '0x0' && participateInMetaMetrics) {
const metamaskState = await this.getState()
backEndMetaMetricsEvent(metamaskState, {
customVariables: {
errorMessage: txMeta.simulationFails.reason,
},
eventOpts: {
category: 'backend',
action: 'Transactions',
name: 'On Chain Failure',
},
})
}
} }
}) })

@ -375,7 +375,7 @@ export function setTransactionToConfirm (transactionId) {
dispatch(updateMethodData(methodData)) dispatch(updateMethodData(methodData))
try { try {
const toSmartContract = await isSmartContractAddress(to) const toSmartContract = await isSmartContractAddress(to || '')
dispatch(updateToSmartContract(toSmartContract)) dispatch(updateToSmartContract(toSmartContract))
} catch (error) { } catch (error) {
log.error(error) log.error(error)

@ -124,10 +124,10 @@ function composeUrl (config, permissionPreferences = {}) {
numberOfTokens: customVariables && customVariables.numberOfTokens || numberOfTokens, numberOfTokens: customVariables && customVariables.numberOfTokens || numberOfTokens,
numberOfAccounts: customVariables && customVariables.numberOfAccounts || numberOfAccounts, numberOfAccounts: customVariables && customVariables.numberOfAccounts || numberOfAccounts,
}) : '' }) : ''
const url = configUrl || `&url=${encodeURIComponent(currentPath.replace(/chrome-extension:\/\/\w+/, METAMETRICS_TRACKING_URL))}` const url = configUrl || currentPath ? `&url=${encodeURIComponent(currentPath.replace(/chrome-extension:\/\/\w+/, METAMETRICS_TRACKING_URL))}` : ''
const _id = metaMetricsId && !excludeMetaMetricsId ? `&_id=${metaMetricsId.slice(2, 18)}` : '' const _id = metaMetricsId && !excludeMetaMetricsId ? `&_id=${metaMetricsId.slice(2, 18)}` : ''
const rand = `&rand=${String(Math.random()).slice(2)}` const rand = `&rand=${String(Math.random()).slice(2)}`
const pv_id = `&pv_id=${ethUtil.bufferToHex(ethUtil.sha3(url || currentPath.match(/chrome-extension:\/\/\w+\/(.+)/)[0])).slice(2, 8)}` const pv_id = (url || currentPath) && `&pv_id=${ethUtil.bufferToHex(ethUtil.sha3(url || currentPath.match(/chrome-extension:\/\/\w+\/(.+)/)[0])).slice(2, 8)}` || ''
const uid = metaMetricsId && !excludeMetaMetricsId const uid = metaMetricsId && !excludeMetaMetricsId
? `&uid=${metaMetricsId.slice(2, 18)}` ? `&uid=${metaMetricsId.slice(2, 18)}`
: excludeMetaMetricsId : excludeMetaMetricsId

@ -48,6 +48,7 @@ const selectors = {
getNumberOfAccounts, getNumberOfAccounts,
getNumberOfTokens, getNumberOfTokens,
isEthereumNetwork, isEthereumNetwork,
getMetaMetricState,
} }
module.exports = selectors module.exports = selectors
@ -165,7 +166,7 @@ function getSelectedToken (state) {
const tokens = state.metamask.tokens || [] const tokens = state.metamask.tokens || []
const selectedTokenAddress = state.metamask.selectedTokenAddress const selectedTokenAddress = state.metamask.selectedTokenAddress
const selectedToken = tokens.filter(({ address }) => address === selectedTokenAddress)[0] const selectedToken = tokens.filter(({ address }) => address === selectedTokenAddress)[0]
const sendToken = state.metamask.send.token const sendToken = state.metamask.send && state.metamask.send.token
return selectedToken || sendToken || null return selectedToken || sendToken || null
} }
@ -314,3 +315,15 @@ function preferencesSelector ({ metamask }) {
function getAdvancedInlineGasShown (state) { function getAdvancedInlineGasShown (state) {
return Boolean(state.metamask.featureFlags.advancedInlineGas) return Boolean(state.metamask.featureFlags.advancedInlineGas)
} }
function getMetaMetricState (state) {
return {
network: getCurrentNetworkId(state),
activeCurrency: getSelectedAsset(state),
accountType: getAccountType(state),
metaMetricsId: state.metamask.metaMetricsId,
numberOfTokens: getNumberOfTokens(state),
numberOfAccounts: getNumberOfAccounts(state),
participateInMetaMetrics: state.metamask.participateInMetaMetrics,
}
}

Loading…
Cancel
Save