Заметки консультанта

Шамрай Александр Владимирович

Archive for Май 2014

Практическое руководство по отчетности TFS. Практические отчеты

Posted by Шамрай Александр на Май 16, 2014

Отчет «Длительность сборки»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала. Этот отчет содержит более полезную альтернативу, отображая детали каждого шага и продолжительность в неиерархическом виде.
Версия TFS 2010, TFS 2012
Категория Отчет о состоянии

Таблица 3. Отчет «Длительность сборки»

Рисунок 2. Отчет «Длительность сборки»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя командной коллекции.

Пример

TFS 2010

Следующий код работает для TFS 2010. В этом примере мы устанавливаем @BuildId как последнюю сборку. Если вы хотите получить результат для конкретной сборки, то вам необходимо будет установить значение идентификатора сборки.

  • Tbl_build – таблица содержит запись для каждой сборки.
  • Tbl_InformationType – таблица хранит информацию каждого шага, который выполняется как часть командной сборки.
  • Tbl_buildInformation – таблица с информацией о сборке, которая хранит детальную информацию о результате выполнения каждого шага, указанную в виде информационного типа сборки, для каждой сборки. Схема таблицы отличается у TFS 2010 и TFS2012. В TFS2012 таблица хранит информацию в столбце с именованными полями, в то время как в TFS2010 информация хранятся в отдельной таблице, называемой tbl_BuildInformationFields.
  • Tbl_buildInformationFields – таблица содержит информационные поля для каждой строки tbl_BuildInformation для каждой сборки. Количество полей зависит от BuildInformationType.

 

Код 1.
Отчет «Длительность сборки» для TFS 2010

DECLARE @BuildId int;

— Using this SELECT as just an example to get the latest build to view the details of

SELECT @BuildId = MAX(BuildId) FROM tbl_BuildInformation bi WITH(NOLOCK);

 

SELECT bi.NodeId

,bi.ParentId

,bity.TypeName

,bi.LastModifiedDate

,dpt.FieldValue DisplayText

,CONVERT(DATETIME2, st.FieldValue) StartTime

,CONVERT(DATETIME2, ft.FieldValue) FinishTime

,DATEDIFF(SECOND, st.FieldValue, ft.FieldValue) AS Duration (Seconds)

,CAST((DATEDIFF(SECOND, st.FieldValue, ft.FieldValue))/60.0 AS DECIMAL (12,2)) AS Duration (Minutes)

,sp.FieldValue ServerPath

FROM tbl_BuildInformation bi WITH(NOLOCK)

INNER JOIN tbl_BuildInformationType bity on bi.NodeType = bity.NodeType

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘DisplayText‘) dpt ON bi.NodeId = dpt.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘StartTime‘) st ON bi.NodeId = st.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘FinishTime‘) ft ON bi.NodeId = ft.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘ServerPath‘) sp ON bi.NodeId = sp.NodeId

WHERE BuildId = @BuildId

AND bity.TypeName NOT IN (‘BuildMessage‘,

BuildWarning‘,

ExternalLink‘,

ConfigurationSummary‘)

ORDER BY NodeId;

TFS 2012

Схема базы данных TFS 2010 отличается от TFS2012 и tbl_BuildInformation таблицы больше не существует. Поэтому упомянутый выше запрос не будет работать в TFS2012. Альтернативный подход заключается в использовании API в Team Foundation Server, в использовании доступного интерфейса и получении отчета через настроенную службу. В этом случае я создал WCF службу со следующим интерфейсом.

Код 2.
Интерфейс IBuildReports для отчета «Длительность сборки» для TFS 2012

/// <summary>

/// The IBuildReports service interface provide methods for a the various build reports

/// created from Team Foundation Server’s service

/// </summary>

[ServiceContract]

public interface IBuildReports

{

/// <summary>

/// Returns the Build Step Duration report for a given build

/// </summary>

/// <param name=»projectCollectionUri»>The Project collection Uri</param>

/// <param name=»teamProjectName»>The Team Project Name</param>

/// <param name=»buildDefinitionName»>The build definition name for the build for which the report should return the build duration. Only the latest build is extracted.</param>

/// <param name=»reportOption»>An enumeration that determines which steps should be returned</param>

/// <returns>A list of build steps with their respective duration</returns>

[OperationContract]

IEnumerable<BuildStep> GetBuildStepDurationReport(string projectCollectionUri, string teamProjectName, string buildDefinitionName, BuildStepDurationReportOption reportOption);

}

Интерфейс имеет одну операцию для отчета по продолжительности шага сборки. Эта операция принимает следующие параметры и возвращает перечисление шагов сборки, содержащее информацию о шагах, таких как имя, время начала, время окончания и продолжительность.

Параметр Описание
projectCollectionUri URI подключения коллекции командного проекта.
teamProjectName Имя командного проекта, который содержит сборку.
buildDefinitionName Имя определения сборки.
reportOptions Перечисление возможно со следующими опциями:

  • All – возвращает все шаги сборки
  • SlowestTen – возвращает 10 самых продолжительных сборки
  • FastestTen – возвращает 10 самых быстрых сборки.

Таблица 4.
Параметры отчета «Длительность сборки» для TFS 2012

Тип возвращаемого значения является перечисление объектов типа «BuildStep», которое содержит сведения о каждом шаге сборки и времени его выполнения. Тип Шаг Сборки выглядит следующим образом:

Код 3.
Отчет «Длительность сборки» для TFS 2012 тип BuildStep

[DataContract]

public class BuildStep

{

/// <summary>

/// Gets or sets the name of the Build Step

/// </summary>

[DataMember]

public string Name { get; set; }

/// <summary>

/// Gets or sets the Start Time of the Build Step

/// </summary>

[DataMember]

public DateTime StartTime { get; set; }

/// <summary>

/// Gets or sets the End Time of the Build Step

/// </summary>

[DataMember]

public DateTime? EndTime { get; set; }

/// <summary>

/// Gets or sets the Duration of the build Step

/// </summary>

[DataMember]

public TimeSpan? Duration { get; set; }

}

Реализация IBuildReports показана ниже:

/// <summary>

/// The BuildReports class provides functionality for all Build Reports created from Team Foundation

/// Server’s service

/// </summary>

public class BuildReports : IBuildReports

{

/// <summary>

/// Returns the Build Step Duration report for a given build

/// </summary>

/// <param name=»projectCollectionUri»>The Project collection Uri</param>

/// <param name=»teamProjectName»>The Team Project Name</param>

/// <param name=»buildDefinitionName»>The build definition name for the build for which the report should return the build duration. Only the latest build is extracted.</param>

/// <param name=»reportOption»>An enumeration that determines which steps should be returned</param>

/// <returns>A list of build steps with their respective duration</returns>

public IEnumerable<BuildStep> GetBuildStepDurationReport(string projectCollectionUri, string teamProjectName, string buildDefinitionName, BuildStepDurationReportOption reportOption)

{

ValidateBuildStepDurationParameters(projectCollectionUri, teamProjectName, buildDefinitionName);

var buildCollections = new Collection<BuildStep>();

var teamCollection = GetTeamCollection(projectCollectionUri);

var buildserver = teamCollection.GetService<IBuildServer>();

var buildDefinitionSpec = buildserver.CreateBuildDefinitionSpec(teamProjectName, buildDefinitionName);

var buildDetails = buildserver.QueryBuilds(buildDefinitionSpec);

if (buildDetails != null && buildDetails.Count() > 0)

{

var build = buildDetails.OrderByDescending(s => s.StartTime).FirstOrDefault();

build.Information

.GetSortedNodes(new BuildInformationComparer())

.ForEach(item => AddBuildInformation(buildCollections, item));

}

return buildCollections;

}

private static void ValidateBuildStepDurationParameters(string projectCollectionUri, string teamProjectName, string buildDefinitionName)

{

if (string.IsNullOrWhiteSpace(projectCollectionUri))

{

throw new ArgumentNullExceptionprojectCollectionUri«);

}

if (string.IsNullOrWhiteSpace(teamProjectName))

{

throw new ArgumentNullExceptionteamProjectName«);

}

if (string.IsNullOrWhiteSpace(buildDefinitionName))

{

throw new ArgumentNullExceptionbuildDefinitionName«);

}

if (!Uri.IsWellFormedUriString(projectCollectionUri, UriKind.Absolute))

{

throw new ArgumentExceptionMalformed Uri«, «projectCollectionUri«);

}

}

private static TfsTeamProjectCollection GetTeamCollection(string projectCollectionUri)

{

var teamCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection( new Uri(projectCollectionUri.ToString(), UriKind.Absolute));

teamCollection.EnsureAuthenticated();

return teamCollection;

}     

private static void AddBuildInformation(Collection<BuildStep> collection, IBuildInformationNode buildInformation)

{    

if (buildInformation.Fields.ContainsKey(«StartTime«) && buildInformation.Fields.ContainsKey(«FinishTime«) && buildInformation.Fields.ContainsKey(«DisplayText«))

{

collection.Add(new BuildStep()

{

Name = buildInformation.Fields[«DisplayText«],

StartTime = DateTime.Parse(buildInformation.Fields[«StartTime«]),

EndTime = DateTime.Parse(buildInformation.Fields[«FinishTime«]),

Duration = DateTime.Parse(buildInformation.Fields[«FinishTime«]) — DateTime.Parse(buildInformation.Fields[«StartTime«])

});

}

}

internal class BuildInformationComparer : IComparer<IBuildInformationNode>

{

public int Compare(IBuildInformationNode itemToCompare, IBuildInformationNode itemToCompareWith)

{

if (itemToCompare.Id > itemToCompareWith.Id)

{

return 1;

}

else if (itemToCompare.Id == itemToCompareWith.Id)

{

return 0;

}

return -1;

}

}

}

Установка службы

  • Скопируйте папку «_Published» сервиса на ваш веб-сервер.
  • Создайте новый веб-сайт или виртуальный каталог и назначьте его на папку «_Published».
  • Создайте новый пул приложений и настройте его для запуска с учетной записью, имеющей следующие разрешения в командном проекте.
    • Удаление сборки
    • Обновление информации о сборке
    • Просмотр сборки.
    • Просмотр определения сборки.
  • Убедитесь, что параметр «Включить 32-битные приложения» в пуле приложений установлен в значение истина.
  • Ваш сервис теперь готов для использования.

Отчет «Длительность сборки с течением времени»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала.Отчет, описанный здесь, обеспечивает полезную альтернативу, показывая вам все сборки в командной коллекции в одном отчете с их длительностью.
Версия TFS 2012
Категория Отчет о состоянии

Таблица 5. Отчет «Длительность сборки с течением времени»

Рисунок 3. Отчет «Длительность сборки с течением времени»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя коллекции команды.

Пример

Запрос может быть расширен для использования диапазона дат, чтобы увидеть результаты за период времени.

Ниже приводится краткое описание о каждой из таблиц, используемой в отчете:

  • tbl_Build – Таблица содержит записи для каждой командной сборки.
  • tbl_BuildQueue – В таблице хранятся сведения о том, когда конкретная сборка была поставлена в очередь.
  • tbl_BuildDefinition – Таблица определений сборок хранит информацию о созданном определении сборки.
  • tbl_BuildController – В таблице контроллер сборки хранит сведения о контроллере сборок
  • tbl_BuildInformation – таблица информации о сборке содержит сведения о сборке в отношении различных ее элементов. Например, для каждой сборки есть запись сборочной информации для Сообщения Сборки, Влияния На Тесты и т.д.
  • tbl_BuildInformationType — типы информации, которые хранятся в таблице информации о сборке, содержатся в таблице tbl_BuildInformationType

Код 5. Отчет «Длительность сборки с течением времени»

SELECT REPLACE(REPLACE(REPLACE(bd.DefinitionName, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildDefinitionName,

REPLACE(REPLACE(REPLACE(bld.BuildNumber, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildNumber,

CAST(DATEDIFF(SECOND, bld.StartTime, bld.FinishTime)/60 AS Decimal(5,1)) AS BuildDuration,

bld.[StartTime],bld.[FinishTime],[DropLocationRoot],bc.DisplayName AS BuildController

,RA.Field.value(‘(./Value)[1]’, ‘varchar(100)’) AS BuildAgent

FROM [dbo].[tbl_Build] bld

INNER JOIN tbl_BuildDefinition bd ON bld.DefinitionId = bd.DefinitionId

INNER JOIN tbl_BuildInformation bi ON bi.BuildId = bld.BuildId

INNER JOIN tbl_BuildController bc WITH(NOLOCK) ON bc.ControllerId = bld.ControllerId

INNER JOIN tbl_BuildInformationType bty WITH(NOLOCK) ON bi.NodeType = bty.NodeType

cross apply bi.Fields.nodes(‘/Fields/Field’) as RA(Field)

WHERE RA.Field.value(‘(./@Name)[1]’, ‘varchar(100)’) = ‘ReservedAgentName’

ORDER BY StartTime DESC

Отчет «Состояние сборки с течением времени»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала.Отчет, описанный здесь, обеспечивает полезную альтернативу, показывая вам все сборки в командной коллекции в одном отчете с описанием времени начала, окончания и длительности сборок. Запрос может быть расширен диапазоном дат, чтобы увидеть результат за определенный период.
Версия TFS 2012
Категория Отчет о состоянии

Таблица 6. Отчет «Состояние сборки с течением времени»

Рисунок 4. Отчет «Состояние сборки с течением времени»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя коллекции команды.

Пример

Следующий код работает для TFS 2012. Таблица очереди сборок (tbl_BuildQueue) не содержит исторические данные за последние 24 часа. Если вы хотите хранить больше данных, то вам нужно будет создать отдельную таблицу в другой базе данных.

Не следует создавать каких-либо таблиц, хранимых процедур или представлений в базе данных TFS. Если вы собираетесь поддерживать исторические данные, создайте отдельную базу данных для этого.

  • tbl_Build – Таблица содержит записи для каждой командной сборки.
  • tbl_BuildQueue – В таблице хранятся сведения о том, когда конкретная сборка была поставлена в очередь.
  • tbl_BuildDefinition – Таблица определений сборок хранит информацию о созданном определении сборки.
  • tbl_BuildController – В таблице контроллер сборки хранит сведения о контроллере сборок
  • tbl_BuildInformation – таблица информации о сборке содержит сведения о сборке в отношении различных ее элементов. Например, для каждой сборки, есть запись сборочной информации для Сообщения Сборки, Влияния На Тесты и т.д.
  • tbl_BuildInformationType — типы информации, которые хранятся в таблице информации о сборки, содержатся в таблице tbl_BuildInformationType

Код 6. Отчет «Состояние сборки с течением времени»

SELECT REPLACE(REPLACE(REPLACE(bd.DefinitionName, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildDef

,bd.[Description]

—,bq.DateCreated

,bq.QueueTime AS ‘Queued Time UTC’

,REPLACE(REPLACE(REPLACE(b.BuildNumber, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildNumber

,b.StartTime AS ‘Build Start Time UTC’

,b.FinishTime AS ‘Build Finish Time UTC’

,DATEDIFF(SECOND ,bq.QueueTime, b.StartTime) AS ‘Queue Time Seconds’,

bc.DisplayName As BuildController,

RA.Field.value(‘(./Value)[1]’, ‘varchar(100)’) As BuildAgent

FROM tbl_Build b WITH(NOLOCK)

INNER JOIN tbl_BuildQueue bq WITH(NOLOCK) ON b.BuildId = bq.BuildId

INNER JOIN tbl_BuildDefinition bd WITH(NOLOCK) ON b.DefinitionId = bd.DefinitionId

INNER JOIN tbl_BuildController bc WITH(NOLOCK) ON bc.ControllerId = b.ControllerId

INNER JOIN tbl_BuildInformation bi WITH(NOLOCK) ON bi.BuildId = b.BuildId

INNER JOIN tbl_BuildInformationType bity WITH(NOLOCK) on bi.NodeType = bity.NodeType

cross apply bi.Fields.nodes(‘/Fields/Field’) as RA(Field)

WHERE RA.Field.value(‘(./@Name)[1]’, ‘varchar(100)’) = ‘ReservedAgentName’ AND bity.TypeName=‘AgentScopeActivityTracking’

Отчет «Среднее время между сбоями» (MBTF)

Контекст Отчет MTBF или среднее время между сбоями описывает среднее время между тем, когда проблема была найдена в промышленной среде, до момента, когда найдена следующая проблема.С точки зрения TFS возникновение проблемы отслеживается созданием рабочего элемента ошибки с типом «Ошибка». Таким образом, чтобы создать такой отчет, запрос будет искать рабочие элементы типа «Ошибка». Для получения информации мы будем использовать базу данных TfS_Warehouse, которая хранит всю информацию в соответствии со схемой звезда. В базе данных имеется таблица измерений, которая называется DimWorkItem и хранит все рабочие элементы. Однако, т.к. это таблица измерений, все изменения в любом поле в рабочем элементе приводят к новой строке в этой таблице. К счастью база данных Tfs_Warehouse также содержит представление таблицы измерений DimWorkItem, который возвращает текущее состояние каждого рабочего элемента. Представление, которое называется CurrentWorkItemView, — это то, что мы будем использовать в запросе.

Теперь, когда мы знаем, где находятся сведения о рабочем элементе, следующий фактор для рассмотрения – как определить время, прошедшее между созданием двух ошибок. Поле Microsoft_VSTS_Common_ActivatedDate содержит дату и время, когда рабочий элемент был создан, и это то, что мы будем использовать. Если мы сможем сортировать результаты и вычислить разницу между каждой соседней строкой в запросе, то у нас будет нужная информация. Предложения ROW_NUMBER и ORDER в SQL Server содержат необходимые функциональные возможности.

Заключительная часть мозаики – это фильтрация рабочих элементов. Т.к. затраченное время рассматривается в историческом контексте, мы будем фильтровать рабочие элементы, чтобы включать только те, которые закрыты по полю System_State и которые принадлежать данному командному проекту через поле ProjectPath.

Версия TFS 2012
Категория Отчет о рабочих элементам

Таблица 7. Отчет «Среднее время между сбоями»

Рисунок 5. Пример отчета «Среднее время между сбоями»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

CurrentWorkItemView – представление извлекает текущее состояние каждого рабочего элемента из таблицы измерений DimWorkItem.

Запрос выбирает все рабочие элементы типа «Ошибка» из данного командного проекта с состоянием «Закрыто» и отсортированными по Дате активации. Следующая задача заключается в том, чтобы вычислить разницу между двумя соседними записями. Для этого используется предложение ROWNUMBER и ORDER, чтобы дать уникальный номер для каждой строки результата. Затем результат объединяется по соседним строкам и вычисляет разницу между Дата активации для смежных рабочих элементов и затем с помощью статистической функции AVG определяется среднее количество часов.

Код 7. Отчет «Среднее время между сбоями»

DECLARE @ProjectPath varchar(255);

— Using this SELECT as just an example to get the latest build to view the details of

—SELECT @ProjectPath = ‘DefaultCollection\TeamProjectName’;

SELECT

RIGHT(‘0’ + CAST(DatePart(wk,CurrentBug.Date) as Varchar) + ‘/’ +

Cast(DatePart(yyyy,CurrentBug.Date) as Varchar), 7) as Week,

AVG(DateDiff(hh, FormerBug.Date, CurrentBug.Date)) as [MTBF in hours]

FROM

(SELECT (

ROW_NUMBER()

OVER(ORDER BY Microsoft_VSTS_Common_ActivatedDate asc) + 1) as ID,

Microsoft_VSTS_Common_ActivatedDate as Date

FROM

dbo.CurrentWorkItemView WITH (NOLOCK)

WHERE

System_WorkItemType = ‘Bug’

AND System_State = ‘Closed’

and ProjectPath like @ProjectPath

) as FormerBug

INNER JOIN

(SELECT (

ROW_NUMBER()

OVER(ORDER BY Microsoft_VSTS_Common_ActivatedDate asc)) as ID,

Microsoft_VSTS_Common_ActivatedDate as Date

FROM

dbo.CurrentWorkItemView WITH (NOLOCK)

WHERE

System_WorkItemType = ‘Bug’

AND System_State = ‘Closed’

and ProjectPath like @ProjectPath

) AS CurrentBug

ON FormerBug.ID = CurrentBug.ID

GROUP BY

DatePart(wk, CurrentBug.Date),

DatePart(yyyy, CurrentBug.Date)

Отчет «Среднее время решения проблем» (MTTR)

Контекст MTTR среднее время, прошедшее с момента, когда проблема обнаружена в промышленной среде, до момента, когда проблема устранена. Для того чтобы отслеживать MTTR, вы определяете данные, которые вам нужно, и как извлечь их из TFS. В шаблоне процесса MSF для гибкой разработки проблемы в промышленной среде представлены рабочим элементом ошибка, т.е. нужно отфильтровать по этому типу рабочего элемента и командному проекту.Не все ошибки, хранящиеся в командном проекте TFS, полезны для отслеживания MTTR. Нужны только те, которые были исправлены в промышленной среде. Также нужно фильтровать по командному проекту и нужно два поля для расчета MTTR. Первое поле — это момент, когда ошибка обнаружена в промышленной среде. Второе поле, когда ошибка исправлена и ее состояние становится закрытым. В шаблоне MSF для гибкой разработки это значение автоматически сохраняется в поле Дата закрытия.

Вы должны также принять решение о том, как представить данные в заключительном отчете. Расчет MTTR является временем, прошедшим между значениями Дата закрытия и Дата активации. Тем не менее, этот отчет будет более удобочитаемым, если будет скорректирован по значениям единиц времени и сгруппированы по результатам».

Версия TFS 2012
Категория Отчет о рабочих элементам

Таблица 8. Отчет «Среднее время решения проблем»

Рисунок 6. Пример отчета «Среднее время решения проблем»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

Код 8. Отчет «Среднее время решения проблем»

DECLARE @ProjectPath varchar(255);

— Using this SELECT as just an example to get the latest build to view the details of

—SELECT @ProjectPath = ‘DefaultCollection\TeamProjectName’;

SELECT

— We are adding a trailing ‘0’ for 1-digit week numbers,

— so we use the RIGHT function to remove it if was not

— needed because the week number had 2 digits.

RIGHT

(

‘0’

— Number of the week inside the year

+ CAST(DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate])

AS VARCHAR)

— Separator

+ ‘/’

— Year

+ CAST(DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate])

AS VARCHAR)

— Maximum length of the returned value (format: WW/YYYY)

, 7

) AS [Week]

— Mean Time To Recover, in hours, per each week

,AVG(

DATEDIFF(hh, [Microsoft_VSTS_Common_ActivatedDate],

[Microsoft_VSTS_Common_ClosedDate])

) AS [MTTR in hours]

FROM

[dbo].[CurrentWorkItemView] WITH(NOLOCK)

WHERE

[ProjectPath] like @ProjectPath = ‘\DefaultCollection\Lab04-Metrics’

AND [System_WorkItemType] = ‘Bug’

AND [System_State] = ‘Closed’

GROUP BY

— Grouping by week and year to calculate the average

DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate]),

DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate])

ORDER BY

— Ordering by year and week number

DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate]) DESC,

DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate]) DESC

Отчет «Отслеживание времени»

Контекст Отчет по отслеживанию времени отображает каждую версию рабочего элемента и его влияние на оставшуюся работу для данного рабочего элемента. Идея заключается в том, что люди обновляют рабочие элементы по выполнению части работы, они будут постоянно обновлять поле Оставшиеся трудозатраты. Отчет будет использовать этот запрос для отслеживания, сколько работы осталось.
Версия TFS 2010, TFS 2012
Категория Отчет о рабочих элементам

Таблица 9. Отчет «Отслеживание времени»

Рисунок 7. Пример отчета отслеживания времени в Scrum 2.2

Рисунок 7. Пример отчета отслеживания времени в MSF Agile

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

Основные параметры

Это список основных параметров, которые необходимы для отчета, они не должны удаляться.

Параметр Применение
ProjectName Используется для фильтрации рабочих элементом. В отчете отображаются рабочие элементы только для командного проекта с заданным именем.

Таблица 10. Параметры отчета «Отслеживание времени»

Этот параметр устанавливается следующим образом:

Рисунок 7. Параметр отчета

Источники данных

В отчете содержится только один источник данных Tfs_Warehouse и должен быть сопоставлен к базе данных Tfs_Warehouse.

Пошаговое руководство

Шаг Инструкции
1. Создайте проект отчета
[ ] – Сделано
  • Запустите BIDS (SQL Server Business Intelligence Development Studio)
  • Создайте новый проект Report Server Project MyCustomReport
2. Добавьте источник данных
[ ] – Сделано
  • В обозревателе решений нажмите правой кнопкой на DataSource, Add New Datasource и назовите его Tfs_Warehouse
  • Сделайте строку соединения и задайте учетные данные для чтения из базы данных Tfs_Warehouse.
3. Добавьте набор данных
[ ] – Сделано
  • В обозревателе решений, щелкните правой кнопкой мыши на DataSets, Add New DataSet
  • Задайте имя набора данных TimeTrackingDataset
  • Выберите источник данных Tfs_Warehouse
  • В Text Area for Query скопируйте и вставьте следующий SQL:

SELECT

[System_Id] As [Id],[System_Rev] As [Rev],

[System_ChangedBy] As [Changed By],

[Microsoft_VSTS_Scheduling_OriginalEstimate] AS [Original Estimate],

[Microsoft_VSTS_Scheduling_RemainingWork] AS [Remaining Work],

[Microsoft_VSTS_Scheduling_CompletedWork] AS [Completed Work],

[System_Title] As [Title],[System_AssignedTo] As [Assigned To],

[System_ChangedDate] As [Changed Date],

[ProjectNodeName] AS [Team Project],

[AreaName],[AreaPath],

[IterationName],

[IterationPath] ,

[Microsoft_VSTS_Scheduling_RemainingWork] — (Select Top 1 IsNull([Microsoft_VSTS_Scheduling_CompletedWork],0)

FROM [Tfs_Warehouse].[dbo].[WorkItemHistoryView] WITH(NOLOCK)

WHERE [System_Id] = WIHV.[System_Id]

AND [System_Rev] = WIHV.[System_Rev] — 1) as [Completed Diff]

FROM

[Tfs_Warehouse].[dbo].[WorkItemHistoryView] WIHV WITH(NOLOCK)

WHERE

/** Filter team project **/

[ProjectNodeName] LIKE @ProjectName

/** Filter correction entries **/

AND [RevisionCount] IS NOT NULL /** Filter empty entries **/

AND ([Microsoft_VSTS_Scheduling_OriginalEstimate] IS NOT NULL

OR [Microsoft_VSTS_Scheduling_RemainingWork] IS NOT NULL

OR [Microsoft_VSTS_Scheduling_CompletedWork] IS NOT NULL)

ORDER BY ID, Rev

  • Нажмите на пункт Parameters и установите флажок Default Value.
  • Установить значение по умолчанию как «%».
  • Нажмите кнопку ОК.
4. Добавьте отчет
[ ] – Сделано
  • В обозревателе решений нажмите правой кнопкой мыши Report, Add existing report и перейдите к отчету TimeTrackingReport.rdl
5. Установите запускаемый отчет для проекта
[ ] – Сделано
  • Щелкните правой кнопкой мыши на узел проекта и выберите Properties
  • Под Debug/Startitem выберите отчет
6. Протестируйте отчет
[ ] – Сделано
  • Нажмите F5 для сборки и тестирования отчета

 

 

Posted in TFS Practical Reporting Guide | Отмечено: , , | Leave a Comment »

Практическое руководство по отчетности TFS. Секреты хранилища данных

Posted by Шамрай Александр на Май 12, 2014

Если вы новичок в администрировании TFS, то вы скорее всего не слышали о замечательных отчетах Гранта Холлидея, которые он разработал для Team Foundation Server. Грант является Старшим Инженером Подразделение поддержки сервисов TF и тратит большую часть своего времени на работы с компаниями по их внедрению TFS.

Грантом был разработан первый пакет отчетов еще в марте 2009 года, и он сохраняется в каждой версии TFS. Существует два набора административных отчетов: пакет для оценки производительности и административный пакет. Пакет для оценки производительности состоит из пяти отчетов:

  • Итоговая оценка времени выполнения
  • Состояние сервера — Очередь запросов управления версиями
  • Состояние сервера — Список пользователей, минующих прокси
  • Состояние сервера – Исторические тенденции производительности
  • Состояние сервера — Последние тенденции производительности

Административный пакет состоит из трех отчетов:

  • Состояние куба
  • Заблокированные поля
  • Поля, включаемые в отчеты

Для использования этих отчетов, вам нужно их загрузить на свой экземпляр Reporting Server Services, потом обновить сведения о безопасности для наборов данных и проверить, что существует соединение.

С TFS 2012 (и 2013) есть новая функция доступная Администратору TFS, которая называется Журнал активности. Эту функцию можно найти по адресу http://ваш-сервер:8080/tfs/_oi. Грант опубликовал информацию о том, как эта информация может просматриваться. Данные, отображаемые на этих страницах, доступны прямо с TFS (транзакционных) операционных таблиц и придерживаются лучших практик Майкрософт относительно доступа к промышленным данным. Страницы, связанные с этой информацией будут продолжать развиваться в будущем, и вы можете ожидать более подробную информацию в нашем руководстве по отчетности.

Документация по отчетности и полезная информация об инструментах

В следующей таблице приведена дополнительная информация по отчетности, на которую вы можете обратить внимание, и ссылки:

Ссылки Описание
Administrative Report Pack for Team Foundation Server 2010

Announcing TFS Performance Report Pack

TFS2010: SQL Queries for TFS Statistics

TFS Internal Usage Statistics — 1st Half CY 2013

Warehouse and Job Service Administrator Reports

Отчеты (на основе SQL Server Reporting Services), которые могут использоваться для оценки и получения представления о состоянии некоторых из внутренних компонентов вашей среды TFS
Data Driven Subscription Reporting a la Grant

Monitoring the TFS Data Warehouse – FAQ

How to generate a report of active users who log onto the TFS server

Публикации блогов
Professional Application Lifecycle Management Книга, которая описывают отчетность, порталы и проектные панели, написанная внутренними сотрудниками Microsoft и MVP.
Professional Team Foundation Server Книга, которая описывает отчетность и проектные панели SharePoint, написанная внутренними сотрудниками Microsoft и MVP.
TFS Planning and DR Avoidance Guide Обсуждение отчетности с точки зрения обеспечения снижения и контроля аварийных ситуаций.

Таблица 1. Документация по отчетности и полезная информация о инструментах

Полезная информация на CodePlex

Было бы упущением не отметить большую работу, проделанную Microsoft ALM Rangers и способствующую сообществу через проекты CodePlex.

Ссылки Описание
Community TFS Report Extensions Проект сообщества, который обеспечивает расширенные отчеты для установки Team Foundation Server. Целью этого проекта является позволить для одного хранилища SQL Server Reporting Services обеспечивать отчеты для Team Foundation 2010 и выше.
GovDev for TFS GovDev является открытым проектом, шаблоном процессов TFS, который сочетает в себе формальность CMMI/водопадного подхода с гибкостью Agile/итерационного подхода.
TFS Scorecard TFS Scorecard дает представление о среде TFS и адаптации TFS в организации. Вы можете увидеть тенденции, активности, управление версиями, а также общую адаптацию для управления рабочими элементами.

Таблица 2. Проекты по отчетности на CodePlex

Диаграммы TFS 2013

Т.к. это руководство вышло в одно время с выпуском в производство TFS 2013, Microsoft ALM Rangers выпустят дополнительные версии отчетности руководства для поддержки новых функций продукта.

Одна из интересных особенностей, реализованных в RTM—это Диаграммы Рабочих Элементов, включающие отчеты в TFS web портал, которые будут выпущены в будущих версиях сервера TFS. Брайан Гарри написал о планах, которые включают в себя:

  • диаграммы тенденций
  • закрепление диаграммы на домашнюю страницу
  • агрегатные функции
  • поддержка большего количества данных, чем просто рабочие элементы

Microsoft будет быстро улучшать область отчетности. Мы часто видим новые функции на сервисах TF, а получить их на локальный TFS можно с ежеквартальными обновлениями.

Вот пример того, какие можно создать диаграммы для рабочих элементов.

Рисунок 1. Диаграммы TFS 2013

Posted in TFS Practical Reporting Guide | Отмечено: , , | Leave a Comment »

 
%d такие блоггеры, как: