diff options
Diffstat (limited to 'deps/node/deps/npm/lib/utils/metrics.js')
-rw-r--r-- | deps/node/deps/npm/lib/utils/metrics.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/deps/node/deps/npm/lib/utils/metrics.js b/deps/node/deps/npm/lib/utils/metrics.js new file mode 100644 index 00000000..0f99c841 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/metrics.js @@ -0,0 +1,77 @@ +'use strict' +exports.start = startMetrics +exports.stop = stopMetrics +exports.save = saveMetrics +exports.send = sendMetrics + +const fs = require('fs') +const path = require('path') +const npm = require('../npm.js') +const regFetch = require('libnpm/fetch') +const uuid = require('uuid') + +let inMetrics = false + +function startMetrics () { + if (inMetrics) return + // loaded on demand to avoid any recursive deps when `./metrics-launch` requires us. + var metricsLaunch = require('./metrics-launch.js') + npm.metricsProcess = metricsLaunch() +} + +function stopMetrics () { + if (inMetrics) return + if (npm.metricsProcess) npm.metricsProcess.kill('SIGKILL') +} + +function saveMetrics (itWorked) { + if (inMetrics) return + // If the metrics reporter hasn't managed to PUT yet then kill it so that it doesn't + // step on our updating the anonymous-cli-metrics json + stopMetrics() + var metricsFile = path.join(npm.config.get('cache'), 'anonymous-cli-metrics.json') + var metrics + try { + metrics = JSON.parse(fs.readFileSync(metricsFile)) + metrics.metrics.to = new Date().toISOString() + if (itWorked) { + ++metrics.metrics.successfulInstalls + } else { + ++metrics.metrics.failedInstalls + } + } catch (ex) { + metrics = { + metricId: uuid.v4(), + metrics: { + from: new Date().toISOString(), + to: new Date().toISOString(), + successfulInstalls: itWorked ? 1 : 0, + failedInstalls: itWorked ? 0 : 1 + } + } + } + try { + fs.writeFileSync(metricsFile, JSON.stringify(metrics)) + } catch (ex) { + // we couldn't write the error metrics file, um, well, oh well. + } +} + +function sendMetrics (metricsFile, metricsRegistry) { + inMetrics = true + var cliMetrics = JSON.parse(fs.readFileSync(metricsFile)) + regFetch( + `/-/npm/anon-metrics/v1/${encodeURIComponent(cliMetrics.metricId)}`, + // NOTE: skip npmConfig() to prevent auth + { + registry: metricsRegistry, + method: 'PUT', + body: cliMetrics.metrics, + retry: false + } + ).then(() => { + fs.unlinkSync(metricsFile) + }, err => { + fs.writeFileSync(path.join(path.dirname(metricsFile), 'last-send-metrics-error.txt'), err.stack) + }) +} |