Я снова поиграл с node.js, и я хотел взять CSV-файл, сгенерированный API-интерфейсом Go, и извлечь время сборки, чтобы мы могли отобразить его на графике.
Поскольку у меня нет экземпляра Go на моей машине, я создал URL-адрес в своем приложении узла, который будет имитировать API и возвращать файл CSV.
Я использую экспресс веб-фреймворк, чтобы позаботиться о некоторых сантехниках:
dashboard.js
var express = require('express') var app = express.createServer(); app.get('/fake-go', function(req, res) { fs.readFile('go.txt', function(err, data) { res.attachment("data.csv"); res.end(data, 'UTF-8'); }); });
go.txt находится в моем домашнем каталоге и выглядит так:
cruise_agent,cruise_job_duration,cruise_job_id,cruise_job_result,cruise_pipeline_counter,cruise_pipeline_label,cruise_stage_counter,cruise_timestamp_01_scheduled,cruise_timestamp_02_assigned,cruise_timestamp_03_preparing,cruise_timestamp_04_building,cruise_timestamp_05_completing,cruise_timestamp_06_completed,tests_failed_count,tests_ignored_count,tests_total_count,tests_total_duration TheOriginalAndTheBest,275,1812,Passed,647,0.647,1,2011-08-02T14:48:33+01:00,2011-08-02T14:48:45+01:00,2011-08-02T14:48:56+01:00,2011-08-02T14:48:57+01:00,2011-08-02T14:53:11+01:00,2011-08-02T14:53:32+01:00,0,0,375,0.076 TheOriginalAndTheBest,20,1815,Cancelled,648,0.648,1,2011-08-02T15:09:32+01:00,2011-08-02T15:09:46+01:00,2011-08-02T15:09:56+01:00,2011-08-02T15:09:56+01:00,,2011-08-02T15:10:17+01:00,,,, TheOriginalAndTheBest,268,1817,Passed,649,0.649,1,2011-08-02T15:14:20+01:00,2011-08-02T15:14:30+01:00,2011-08-02T15:14:40+01:00,2011-08-02T15:14:41+01:00,2011-08-02T15:18:49+01:00,2011-08-02T15:19:09+01:00,0,0,368,0.074 TheOriginalAndTheBest,272,1822,Passed,650,0.650,2,2011-08-02T15:30:31+01:00,2011-08-02T15:30:41+01:00,2011-08-02T15:30:51+01:00,2011-08-02T15:30:52+01:00,2011-08-02T15:35:05+01:00,2011-08-02T15:35:24+01:00,0,0,368,0.083 TheOriginalAndTheBest,271,1825,Passed,651,0.651,1,2011-08-02T15:38:33+01:00,2011-08-02T15:38:44+01:00,2011-08-02T15:38:54+01:00,2011-08-02T15:38:54+01:00,2011-08-02T15:43:06+01:00,2011-08-02T15:43:26+01:00,0,0,368,0.093
Я хотел создать конечную точку, которую я мог бы вызвать, и получить обратно JSON-представление всех различных сборок.
app.get('/go/show', function(req, res) { var site = http.createClient(3000, "localhost"); var request = site.request("GET", "/fake-go", {'host' : "localhost"}) request.end(); request.on('response', function(response) { var data = ""; response.setEncoding('utf8'); response.on('data', function(chunk) { data += chunk; }); response.on('end', function() { var lines = data.split("\n"), buildTimes = []; lines.forEach(function(line, index) { var columns = line.split(","); if(index != 0 && nonEmpty(columns[9]) && nonEmpty(columns[11]) && columns[3] == "Passed") { buildTimes.push({ start : columns[9], end : columns[11]}); } }); res.contentType('application/json'); res.send(JSON.stringify(buildTimes)); }); }); }); function isEmpty(column) { return column !== "" && column !== undefined }
Вероятно, мне следовало бы использовать underscore.js для этого кода, но я пока не хотел бриться!
У меня есть настройка маршрута по умолчанию, так что я могу просто перейти на localhost: 3000 и посмотреть графики:
app.get('/', function(req, res){ res.render('index.jade', { title: 'Dashboard' }); });
На стороне клиента мы можем затем создать график, используя RGraph API:
index.jade
h2(align="center") Project Dashboard script function drawGoGraph(buildTimes) { var go = new RGraph.Line('go', _(buildTimes).map(function(buildTime) { return (new Date(buildTime.end) - new Date(buildTime.start)) / 1000 }).filter(function(diff) { return diff > 0; })); go.Set('chart.title', 'Build Times'); go.Set('chart.gutter.top', 45); go.Set('chart.gutter.bottom', 125); go.Set('chart.gutter.left', 50); go.Set('chart.text.angle', 90); go.Set('chart.shadow', true); go.Set('chart.linewidth', 1); go.Draw(); } $(document).ready(function() { $.getJSON('/go/show', function(data) { drawGoGraph(data); }); }); div(align="center") canvas(id="go", width="500", height="400") [Please wait...]
Мы просто делаем некоторое простое вычитание между временем начала и окончания сборки, а затем отфильтровываем любые результаты, которые имеют время окончания до времени начала. Я не совсем уверен, почему мы в конечном итоге с такими записями, но те, которые на графике полностью разрушают его!
Мы включаем все файлы .js в файл layout.jade .
layout.jade
!!! 5 html(lang="en") head title Project Dashboard script(src="RGraph/libraries/RGraph.common.core.js") script(src="RGraph/libraries/RGraph.common.context.js") script(src="RGraph/libraries/RGraph.common.annotate.js") script(src="RGraph/libraries/RGraph.common.tooltips.js") script(src="RGraph/libraries/RGraph.common.zoom.js") script(src="RGraph/libraries/RGraph.common.resizing.js") script(src="RGraph/libraries/RGraph.line.js") script(src="jquery-1.6.2.min.js ") script(src="underscore-min.js")
И вуаля:
С http://www.markhneedham.com/blog/2011/08/13/node-js-building-a-graph-of-build-times-using-the-go-api/