Azure DevOps で Analytics の OData クエリを構築する
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure DevOps のレポート プラットフォームである Analytics は、プロジェクトの過去または現在の状態に関する定量的な質問に回答できます。 Analytics では、メタデータとエンティティ セット データの OData クエリがサポートされています。 Web ブラウザーから簡単なクエリを実行することで、データ モデルとクエリ プロセスに慣れることができます。
この記事では、次の内容について説明します。
- クラウドまたはオンプレミスの Analytics OData クエリを構築する方法
- Analytics メタデータのクエリを実行する方法
- エンティティ セットに対して Analytics OData のクエリを実行する方法
- サポートされているクエリ オプションと推奨されるシーケンス
- サーバー側のページングが適用される場合
サポートされている任意 の Web ブラウザーから Analytics にクエリを実行できます。 Analytics のクエリに使用できるその他のツールについては、Analytics クエリ ツールに関するページを参照してください。
Note
OData は、RESTful (REST= Representational State Transfer) インターフェイスを介してデータを操作するためのアプリケーション レベルのプロトコルであり、データ モデルの説明と、それらのモデルに従ったデータの編集とクエリをサポートします。 エンティティ データ モデル (EDM) またはメタデータは、データのクエリを実行してレポートを作成するために使用するエンティティ、エンティティ型、プロパティ、リレーションシップ、列挙型など、Analytics から入手できる情報を記述します。 OData の概要については、「OData へようこそ」を参照してください。
前提条件
- アクセス: 少なくとも Basic アクセス権を持つプロジェクトのメンバーである。
- 権限: 既定では、プロジェクト メンバーは Analytics にクエリを実行し、ビューを作成する権限を持ちます。
- サービスと機能の有効化と一般的なデータ追跡アクティビティに関するその他の前提条件の詳細については、「Analytics にアクセスするためのアクセス許可と前提条件」を参照してください。
メタデータに対してクエリを実行する URL コンポーネント
Analytics は、メタデータ URL でエンティティ モデルを公開し、サービス ルート URL に追加$metadata
して形成します。 Analytics は、Azure DevOps のプロジェクトまたは組織全体のサービス ルートを提供します。
メタデータのクエリを実行して、次のいずれかのデータ要素を検索できます。
- エンティティ型とエンティティ セット
- プロパティとナビゲーション プロパティ
- 代理キー
- 列挙リスト
- EntitySet
- Containers
- フィルター関数 (
Org.OData.Capabilities.V1.FilterFunctions
) - サポートされている集計 (
Org.OData.Aggregation.V1.ApplySupported
) - Batch のサポート (
Org.OData.Capabilities.V1.BatchSupportType
)
使用する URL は、Azure DevOps Services (クラウド) またはオンプレミスの Azure DevOps Server のデータに対してクエリを実行するかどうかによって異なります。
クラウドでホストされている組織またはプロジェクトのメタデータを照会するには、Web ブラウザーで次に示すように URL 構文を入力します。 {ProjectName}
クエリを実行するプロジェクトの組織名と名前を置き換えます{OrganizationName}
。 組織のすべてのメタデータを返すには、プロジェクト名を指定しないでください。
https://analytics.dev.azure.com/{OrganizationName}/{ProjectName}/_odata/version/$metadata
\______________________________/\______________________________/\______________/\_________/
| | | |
Analytics service root URL Organization/Project OData version return metadata
Note
最新の Analytics OData バージョンは v4.0-preview です。 このバージョンは、ホストされているサービスに対するすべてのクエリに使用できます。 Analytics のバージョンと使用可能なデータの詳細については、「Analytics のデータ モデル」を参照してください。
Azure DevOps Services でホストされている fabrikam 組織の例を次に示します。
https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata
メタデータ応答を解釈する
分析は、データ モデルの XML ファイルを返します。 ブラウザー検索機能を使用して、関心のあるエンティティに固有の情報を検索します。
ヒント
使用しているブラウザーによっては、このファイルが読み取り可能な方法で書式設定される場合とできない場合があります。 書式設定されていない場合は、Web ブラウザー検索で無料のオンライン XML フォーマッタを見つけることができます。
Analytics メタデータで定義されている 2 つの主要なスキーマは Microsoft.VisualStudio.Services.Analytics.Model
、エンティティ型と列挙型とそのメンバーを定義するスキーマであり Default
、エンティティ コンテナーとエンティティ セットとサポートされている OData フィルター、変換、およびカスタム集計関数を定義するスキーマです。 詳細については、「Analytics OData メタデータ」を参照してください。
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Microsoft.VisualStudio.Services.Analytics.Model">
<EntityType Name="Entity Name"/>
</Schema>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Default">
<EntityContainer Name="Container"/>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
関連エンティティとナビゲーション プロパティ
すべてのエンティティ型は、プロパティとナビゲーション プロパティに関連付けられます。 エンティティ セットのクエリは、両方の種類のプロパティを使用してフィルター処理できます。 これらは、次のメタデータの下に一覧表示されます EntityType
Property
NavigationalProperty
。 関連エンティティを使用して、イテレーション パス、エリア パス、Teams などの追加のフィルターを指定します。
次のコード スニペットは、エンティティのメタデータの部分的なビューを WorkItem
提供します。 プロパティは、作業項目フィールドと、分析によってキャプチャされた特定のデータに対応します。たとえばLeadTimeDays
CycleTimeDays
、 ナビゲーション プロパティは、他のエンティティ セット、またはエンティティ型に対してキャプチャされた特定の Analytics データ (例: Revisions
、、Links
、Children
Parent
) に対応します。
<Key>
<PropertyRef Name="WorkItemId"/>
</Key>
<Property Name="WorkItemId" Type="Edm.Int32" Nullable="false">
<Annotation Term="Ref.ReferenceName" String="System.Id"/>
<Annotation Term="Display.DisplayName" String="Work Item Id"/>
</Property>
<Property Name="InProgressDate" Type="Edm.DateTimeOffset">
<Annotation Term="Display.DisplayName" String="InProgress Date"/>
</Property>
<Property Name="CompletedDate" Type="Edm.DateTimeOffset">
<Annotation Term="Display.DisplayName" String="Completed Date"/>
</Property>
<Property Name="LeadTimeDays" Type="Edm.Double">
<Annotation Term="Display.DisplayName" String="Lead Time Days"/>
</Property>
<Property Name="CycleTimeDays" Type="Edm.Double">
<Annotation Term="Display.DisplayName" String="Cycle Time Days"/>
</Property>
<Property Name="InProgressDateSK" Type="Edm.Int32"/>
<Property Name="CompletedDateSK" Type="Edm.Int32"/>
<Property Name="AnalyticsUpdatedDate" Type="Edm.DateTimeOffset"/>
<Property Name="ProjectSK" Type="Edm.Guid" Nullable="false"/>
<Property Name="WorkItemRevisionSK" Type="Edm.Int32" Nullable="false"/>
...
<NavigationProperty Name="BoardLocations" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.BoardLocation)"/>
<NavigationProperty Name="Teams" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.Team)"/>
<NavigationProperty Name="InProgressOn" Type="Microsoft.VisualStudio.Services.Analytics.Model.CalendarDate">
<ReferentialConstraint Property="InProgressDateSK" ReferencedProperty="DateSK"/>
</NavigationProperty>
<NavigationProperty Name="CompletedOn" Type="Microsoft.VisualStudio.Services.Analytics.Model.CalendarDate">
<ReferentialConstraint Property="CompletedDateSK" ReferencedProperty="DateSK"/>
</NavigationProperty>
<NavigationProperty Name="Revisions" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItemRevision)"/>
<NavigationProperty Name="Links" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItemLink)"/>
<NavigationProperty Name="Children" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItem)"/>
<NavigationProperty Name="Parent" Type="Microsoft.VisualStudio.Services.Analytics.Model.WorkItem">
<ReferentialConstraint Property="ParentWorkItemId" ReferencedProperty="WorkItemId"/>
</NavigationProperty>
<NavigationProperty Name="Processes" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.Process)"/>
<NavigationProperty Name="Descendants" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItem)"/>
<NavigationProperty Name="Project" Type="Microsoft.VisualStudio.Services.Analytics.Model.Project" Nullable="false">
<ReferentialConstraint Property="ProjectSK" ReferencedProperty="ProjectSK"/>
<Annotation Term="Display.DisplayName" String="Project"/>
...
エンティティにクエリを実行する URL コンポーネント
Analytics データにクエリを実行し、レポートを作成するには、通常、エンティティ セットに対してクエリを実行します。 サポートされているエンティティの概要については、Analytics OData メタデータに関するページを参照してください。
次の URL を使用して、特定 EntitySet
のクエリを実行します (例: WorkItems
, WorkItemSnapshot
、 PipelineRuns
.
https://analytics.dev.azure.com/OrganizationName/ProjectName/_odata/version/EntityType?{Query-options}
\______________________________/\__________________________/ \____________/\_________/\_____________/
| | | | |
Analytics service root URL Organization/Project OData version Entity Query parts
Fabrikam Fiber プロジェクトに定義されている作業項目の数を返す fabrikam 組織の例を次に示します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?%20$apply=aggregate($count%20as%20Count)
この例では、1399 個の作業項目が返されます。
{
"@odata.context": "https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/$metadata#WorkItems(Count)",
"value": [
{
"@odata.id": null,
"Count": 1399
}
]
}
Note
or $apply
句を$select
含めない場合は、エンティティ セットに対して select ステートメントを実行し、すべての列とすべての行を返すのと同じなどの"VS403507: The specified query does not include a $select or $apply clause which is recommended for all queries. Details on recommended query patterns are available here: https://go.microsoft.com/fwlink/?linkid=861060."
警告が表示されます。 レコードの数が多い場合は、数秒かかる場合があります。 10,000 を超える作業項目がある場合は、 サーバー駆動型ページングが適用されます。
使用制限に達しないようにするには、常に or $apply
句を$select
含めます。
エンティティ メタデータのプロパティとリレーションシップの情報については、次の記事を参照してください。
- カレンダーの日付、プロジェクト、およびユーザーのメタデータ リファレンス
- Azure Boards のメタデータ リファレンス
- Azure Pipelines のメタデータ リファレンス
- テスト 計画のメタデータ リファレンス
例: 特定のエンティティ セットに対してクエリを実行する
などの特定のエンティティ セットに対してクエリを実行するには、WorkItems
Areas
Projects
エンティティ セットの名前を追加します。 /WorkItems
/Areas
/Projects
エンティティ セットの完全な一覧については、Analytics のデータ モデルに関するページを参照してください。
たとえば、プロパティを取得するためにクエリを実行 /Projects
して選択することで、組織に対して定義されたプロジェクトの一覧を ProjectName
取得できます。 fabrikam 組織の場合、URL は次のようになります。
https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/Projects?$select=ProjectName
分析は、fabrikam 組織に対して定義されているプロジェクトのプロジェクト名を返します。
{
@odata.context "https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata#Projects(ProjectName)",
"value": [
{
"ProjectName": "Basic Fabrikam"
},
{
"ProjectName": "Fabrikam Fiber"
},
{
"ProjectName": "MyFirstProject"
},
{
"ProjectName": "Fabrikam Test"
},
{
"ProjectName": "MyPublicProject"
}
]
}
クエリ オプション
クエリ オプションは、URL 内のリソースに対して返されるデータの量を制御するのに役立つ、リソースに適用されるクエリ文字列パラメーターのセットです。
クエリ オプションは、次の表に示す順序で指定する必要があります。
クエリ オプション | メモ |
---|---|
$apply |
クエリに適用できる一連の変換(例: filter , , groupby , , compute expand, aggregate concat 例については、「Analytics を使用して作業追跡データを集計する」を参照してください。 |
$compute |
、$filter または$orderby 式で$select 使用できる計算プロパティを定義するために指定できる、サポートされている OData 関数。 |
$filter |
返されるリソースの一覧をフィルター処理するために使用します。 指定された $filter 式はコレクション内の各リソースに対して評価され、式が true と評価される項目のみが応答に含まれます。 式が false または null に評価されるリソース、またはアクセス許可のために使用できない参照プロパティは、応答から省略されます。例については、「Analytics を使用した作業追跡データのクエリ」を参照してください。 |
$orderby |
レコードを返す順序を指定するために使用します。 例については、「Analytics を使用した作業追跡データのクエリ」を参照してください。 |
$top /$skip |
返されるレコードの数を制限するために使用します。 例については、「プロジェクトと組織スコープのクエリ」を参照してください。 |
$select /$expand |
レポートの作成に必要な列を指定するために使用 $select します。 他のクエリ オプションを入れ子にするために使用 $expand します。 各 expandItem プロパティは、展開されるナビゲーションプロパティまたはストリームプロパティを含むエンティティに対して相対的に評価されます。ナビゲーション プロパティ名をかっこで囲んだ、セミコロンで区切られたクエリ オプションの一覧。 使用できるシステム クエリ オプションは $filter 、 , , $select , $orderby , $skip $top , $count , $search , および $expand .例については、「Analytics を使用した作業追跡データのクエリ」を参照してください。 |
$skiptoken |
指定した数のレコードをスキップするために使用します。 |
$count または $count=true |
レコードの数のみを返す場合に入力 $count します。 レコードのカウントとクエリされたデータの両方を返すには、Enter キーを押 $count=true します。 例については、「Analytics を使用して作業追跡データを集計する」を参照してください。 |
ヒント
1 つのクエリでの混在 $apply
と $filter
句の使用は避けてください。 クエリをフィルター処理するには、2 つのオプションがあります。(1) 句を $filter
使用するか、(2) 組み合わせ句を $apply=filter()
使用します。 これらのオプションはそれぞれ単独でうまく機能しますが、それらを組み合わせると予期しない結果が生じる可能性があります。
サーバー側のページングを適用する
クエリ結果が 1,0000 レコードを超えると、Analytics によって強制的にページングされます。 その場合は、データの最初のページとリンクを取得して次のページを取得します。 リンク (@odata.nextLink
) は、JSON 出力の最後にあります。 元のクエリの後に続く $skip
または $skiptoken
. 次に例を示します。
{
"@odata.context":"https://analytics.dev.azure.com/{OrganizationName}/{ProjectName}/_odata/{version}/$metadata#WorkItems",
"value":[
// 10000 values here
],
"@odata.nextLink":"https://analytics.dev.azure.com/{OrganizationName}/{ProjectName}/_odata/{version}/WorkItems?$skiptoken=10000"
}
Note
Power BI Desktop や Excel などのクライアント ツールにデータをプルすると、ツールは自動的に次のリンクに従い、必要なすべてのレコードを読み込みます。