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 へようこそ」を参照してください

前提条件

メタデータに対してクエリを実行する 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 提供します。 プロパティは、作業項目フィールドと、分析によってキャプチャされた特定のデータに対応します。たとえばLeadTimeDaysCycleTimeDays、 ナビゲーション プロパティは、他のエンティティ セット、またはエンティティ型に対してキャプチャされた特定の Analytics データ (例: Revisions、、LinksChildrenParent) に対応します。

<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, WorkItemSnapshotPipelineRuns.

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含めます。

エンティティ メタデータのプロパティとリレーションシップの情報については、次の記事を参照してください。

例: 特定のエンティティ セットに対してクエリを実行する

などの特定のエンティティ セットに対してクエリを実行するには、WorkItemsAreasProjectsエンティティ セットの名前を追加します。 /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, , computeexpand, 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 などのクライアント ツールにデータをプルすると、ツールは自動的に次のリンクに従い、必要なすべてのレコードを読み込みます。

次のステップ