다음을 통해 공유


Azure DevOps에서 분석에 대한 OData 쿼리 생성

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Azure DevOps 보고 플랫폼인 Analytics는 프로젝트의 과거 또는 현재 상태에 대한 정량적 질문에 답변할 수 있습니다. Analytics는 메타데이터 및 엔터티 집합 데이터의 OData 쿼리를 지원합니다. 웹 브라우저에서 간단한 쿼리를 실행하여 데이터 모델 및 쿼리 프로세스에 대해 알아볼 수 있습니다.

참고

REST(Representational State Transfer) 인터페이스를 통해 데이터와 상호 작용하기 위한 애플리케이션 수준 프로토콜인 OData는 데이터 모델의 설명, 편집 및 쿼리를 지원합니다. EDM(엔터티 데이터 모델) 또는 메타데이터는 보고서를 작성하기 위해 데이터를 쿼리하는 데 사용하는 엔터티, 엔터티 형식, 속성, 관계 및 열거형을 포함하여 Analytics에서 사용할 수 있는 정보를 설명합니다. OData에 대한 개요는 OData 시작 항목을 참조하세요.

이 문서에서는 다음 방법을 설명합니다.

  • Analytics OData 쿼리를 생성합니다.
  • 쿼리 분석 메타데이터.
  • 엔터티 집합에 대한 Analytics OData 쿼리
  • 권장되는 시퀀스에서 쿼리 옵션을 사용합니다.
  • 서버 쪽 페이징을 이해합니다.

지원되는 웹 브라우저에서 분석을 쿼리할 수 있습니다. 분석을 쿼리하는 데 사용할 수 있는 다른 도구는 분석 쿼리 도구를 참조 하세요.

필수 조건

범주 요구 사항
접근 수준 - 프로젝트 멤버.
- 적어도 기본 접근 권한.
사용 권한 기본적으로 프로젝트 멤버는 분석을 쿼리하고 뷰를 만들 수 있는 권한이 있습니다. 서비스 및 기능 사용 및 일반 데이터 추적 활동과 관련된 기타 필수 구성 요소에 대한 자세한 내용은 Analytics에 액세스하기 위한 사용 권한 및 필수 구성 요소를 참조 하세요.

메타데이터 쿼리

분석은 OData 엔터티 모델을 서비스 루트 URL에 $metadata을 추가하여 형성된 메타데이터 URL을 통해 노출합니다. Analytics는 Azure DevOps 프로젝트 또는 전체 조직 및 컬렉션에 대한 서비스 루트를 제공합니다.

메타데이터를 쿼리하여 다음 데이터 요소를 조회할 수 있습니다.

  • 엔터티 형식 및 엔터티 집합
  • 속성 및 탐색 속성
  • 서로게이트 키
  • 나열된 목록
  • 엔터티 집합
  • 컨테이너
  • 필터 함수, Org.OData.Capabilities.V1.FilterFunctions 사용
  • 지원되는 집계, Org.OData.Aggregation.V1.ApplySupported와 함께
  • Batch 지원 유형, Org.OData.Capabilities.V1.BatchSupportType와 함께

클라우드에서 호스트되는 조직 또는 프로젝트에 대한 메타데이터를 쿼리하려면 웹 브라우저에 다음 URL 구문을 입력합니다. <OrganizationName><ProjectName>을(를) 쿼리하려는 조직 및 프로젝트의 이름으로 바꾸십시오. 조직에 대한 모든 메타데이터를 반환하려면 프로젝트 이름을 지정하지 마세요.

https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/version/$metadata 

다음 예제에서는 조직에 대한 메타데이터를 쿼리합니다 fabrikam .

https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata  

쿼리 문자열 analytics.dev.azure.com 에는 Analytics 서비스 루트 URL, 조직 이름, 프로젝트 이름, OData 버전 및 $metadata 지정이 뒤따릅니다.

서버에 대한 메타데이터를 쿼리하려면 웹 브라우저에 다음 URL 구문을 입력합니다. <ServerName>, <CollectionName>, 및 <ProjectName>을(를) 쿼리할 서버, 컬렉션, 프로젝트의 이름으로 바꾸십시오. 컬렉션에 대한 모든 메타데이터를 반환하려면 프로젝트 이름을 지정하지 마세요.

https://<ServerName>/<CollectionName>/<ProjectName>/_odata/version/$metadata 

다음 예제에서는 이름이 지정된 fabrikam-devops 서버와 해당 서버에 대한 메타데이터를 쿼리합니다 DefaultCollection.

https://fabrikam-devops/DefaultCollection/_odata/v4.0-preview/$metadata  

참고

최신 Analytics OData 버전은 v4.0-preview. Azure DevOps에 대한 모든 쿼리에 이 버전을 사용할 수 있습니다. 분석 버전 및 사용 가능한 데이터에 대한 자세한 내용은 분석용 데이터 모델을 참조 하세요.

메타데이터 응답 해석

Analytics는 데이터 모델의 XML 파일을 반환합니다. 브라우저 검색 함수를 사용하여 관심 있는 엔터티에 대한 정보를 찾습니다.

브라우저에 따라 이 파일의 형식이 사람이 읽을 수 있는 방식으로 포맷되지 않을 수 있습니다. 웹 검색을 통해 무료 온라인 XML 포맷터를 찾을 수 있습니다.

분석 메타데이터는 다음 기본 스키마를 정의합니다.

  • Microsoft.VisualStudio.Services.Analytics.Model 는 엔터티 형식과 열거형 형식 및 해당 멤버를 정의합니다.
  • 스키마는 Default 엔터티 컨테이너 및 엔터티 집합 및 지원되는 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>

자세한 내용은 Analytics OData 메타데이터를 참조하세요.

모든 엔터티 형식에는 쿼리를 필터링하는 데 사용할 수 있는 속성과 탐색 속성이 있습니다. 이러한 속성은 메타데이터에 각각 Property또는 NavigationPropertyEntityType 아래에 나열됩니다. 관련 엔터티를 사용하여 반복 경로, 영역 경로 또는 팀과 같은 더 많은 필터를 지정할 수 있습니다.

다음 코드 조각은 엔터티에 대한 WorkItem 메타데이터의 부분 보기를 보여줍니다. 속성은 작업 항목 필드 및 분석에서 캡처한 특정 데이터(예: LeadTimeDaysCycleTimeDays)에 해당합니다. 탐색 속성은 엔터티 형식에 대해 캡처된, 예를 들어 RevisionsLinks, 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"/>
...

엔터티 메타데이터 속성 및 관계 정보는 다음 문서를 참조하세요.

엔터티 집합 조회

분석 데이터를 쿼리하고 보고서를 작성하려면 일반적으로 엔터티 집합을 쿼리합니다. 지원되는 엔터티에 대한 개요는 Analytics OData 메타데이터를 참조하세요.

다음 URL 구문을 사용하여 특정 EntitySet(예: WorkItems, WorkItemSnapshot또는 PipelineRuns)을 쿼리합니다. <EntitySet>를 검색하려는 엔터티로 대체하고, <QueryOptions>를 쿼리 옵션으로 대체하십시오.

https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/version/<EntitySet>?<QueryOptions>

다음 예제에서는 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
   }
 ]
}
https://<ServerName>/<CollectionName>/<ProjectName>/_odata/version/<EntitySet>?<QueryOptions>

다음 예제에서는 Fabrikam 서버의 DefaultCollectionfabrikam 프로젝트에서 작업 항목의 수를 쿼리합니다.

https://fabrikam/DefaultCollection/Fabrikam/_odata/v4.0-preview/WorkItems?%20$apply=aggregate($count%20as%20Count)

예제 쿼리는 작업 항목의 1399 다음 결과를 반환합니다.

{
"@odata.context": "http://fabrikam/DefaultCollection/Fabrikam/_odata/v4.0-preview/$metadata#WorkItems(Count)",
"value": [
   {
      "@odata.id": null,
      "Count": 44
   }
 ]
}

참고

사용량 한도에 도달하지 않도록 항상 쿼리에 $select 또는 $apply 절을 포함하세요. $select 절이나 $apply을 포함하지 않으면 다음과 같은 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 경고가 표시됩니다.

$select 절 또는 $apply 절을 생략하는 것은 모든 열과 모든 행을 반환하는 엔터티 집합에 대해 문장을 수행하는 select 것과 같습니다. 레코드 수가 많은 경우 쿼리에 몇 초 정도 걸릴 수 있습니다. 항목이 10,000개 이상인 경우 서버 쪽 페이징 이 적용됩니다.

예: 특정 엔터티 집합 쿼리

특정 엔터티 집합을 쿼리하려면, WorkItems, Areas, 또는 Projects와 같은 엔터티 집합의 이름을 쿼리에 추가하십시오. 엔터티 집합의 전체 목록은 분석용 데이터 모델을 참조 하세요.

예를 들어 Projects을 쿼리하고 ProjectName 속성을 선택하여 당신의 조직에 대해 정의된 프로젝트 목록을 가져올 수 있습니다. 다음 예제에서는 조직에 대한 쿼리 URL을 보여 있습니다 fabrikam .

https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/Projects?$select=ProjectName

Analytics는 조직의 프로젝트 이름을 반환합니다 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"
   }
 ]
}

예를 들어, Projects를 쿼리하고 ProjectName 속성을 선택하여 서버 및 컬렉션에 정의된 프로젝트 목록을 얻을 수 있습니다. 다음 예제는 DefaultCollection 서버에서의 fabrikam 쿼리 URL을 보여줍니다.

https://fabrikam/DefaultCollection/_odata/v4.0-preview/Projects?$select=ProjectName

이 예제에서는 다음 세 개의 프로젝트 이름을 반환합니다.

{
"@odata.context": "http://fabrikam/DefaultCollection/_odata/v4.0-preview/$metadata#Projects(ProjectName)",
"value": [
   {
      "ProjectName": "Fabrikam Fiber"
   },
   {
      "ProjectName": "Fabrikam"
   },
   {
      "ProjectName": "Fabrikam Florida"
   }
 ]
}

쿼리 옵션 사용

쿼리 옵션은 리소스에 대해 반환되는 데이터의 양을 제어하는 데 도움이 되는 쿼리 문자열 매개 변수입니다. 다음 표에 나열된 순서대로 쿼리 옵션을 지정합니다.

쿼리 옵션 Description
$apply 변환을 쿼리(예: filter, groupby, aggregatecompute, expand또는 concat)에 적용합니다. 예를 들어 분석을 사용하여 집계 작업 추적 데이터 보기를 참조하세요.
$compute $select, $filter 또는 $orderby 식에서 계산된 속성을 정의합니다.
$filter 반환된 리소스 목록을 필터링합니다. 쿼리는 쿼리 범위 내 각 리소스에 대해 지정된 $filter 식을 평가하여, 응답에는 식이 true로 평가되는 항목만 포함됩니다.

식이 false 또는 null로 평가되거나 사용 권한으로 인해 참조 속성을 사용할 수 없는 리소스는 응답에서 생략됩니다. 예를 들어 분석을 사용하여 작업 추적 데이터 쿼리를 참조 하세요.
$orderby 레코드를 반환할 시퀀스를 지정합니다. 예를 들어 분석을 사용하여 작업 추적 데이터 쿼리를 참조 하세요.
$top/$skip 반환되는 레코드 수를 제한합니다. 예제는 Project 및 조직 범위 쿼리를 참조 하세요.
$select 필요한 열을 선택합니다.
$expand 다른 쿼리 옵션을 중첩합니다. 각각 expandItem 은 확장 중인 탐색 또는 스트림 속성을 포함하는 엔터티를 기준으로 평가됩니다.

탐색 속성 이름에 괄호로 묶인 쿼리 옵션의 쉼표로 구분된 목록을 제공합니다. 허용되는 시스템 쿼리 옵션은 $filter, $select,$orderby, $skip, $top$count$search및 .$expand 예를 들어 분석을 사용하여 작업 추적 데이터 쿼리를 참조 하세요.
$skiptoken 지정된 레코드 수를 건너뜁니다.
$count 또는 $count=true 레코드 수만 반환합니다. 레코드 수와 쿼리된 데이터를 모두 반환하려면 입력 $count=true합니다. 예를 들어 분석을 사용하여 집계 작업 추적 데이터 보기를 참조하세요.

단일 쿼리에서 혼합 $apply$filter 절을 사용하지 않습니다. 쿼리를 필터링하려면 절을 $filter 사용하거나 조합 절을 $apply=filter() 사용할 수 있습니다. 두 옵션 모두 작동하지만 단일 쿼리에 결합하면 예기치 않은 결과가 발생할 수 있습니다.

서버 측 페이징 이해하기

분석에서는 쿼리 결과가 10,000개의 레코드를 초과할 때 페이징을 강제합니다. 이 경우 데이터의 첫 번째 페이지와 다음 페이지를 가져오기 위해 따라야 할 링크가 표시됩니다. Power BI Desktop 또는 Excel과 같은 클라이언트 도구는 데이터를 끌어오면 필요한 모든 레코드를 @odata.nextLink 자동으로 따르고 로드합니다.

JSON 출력의 끝에서 @odata.nextLink 링크를 찾을 수 있습니다. 링크는 원래 쿼리 뒤에 $skip 또는 $skiptoken이 오는 것으로 보입니다. 예시:

{
  "@odata.context":"https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata#WorkItems",
  "value":[
   // 10000 values here
  ],
  "@odata.nextLink":"https://https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/WorkItems?$skiptoken=10000"
}

다음 단계