programing

Dummies에 대한 Azure 로그 또는 WCF 데이터 서비스 필터를 필터링하는 방법

golfzon 2023. 4. 29. 10:07
반응형

Dummies에 대한 Azure 로그 또는 WCF 데이터 서비스 필터를 필터링하는 방법

WADLogsTable에서 Azure 로그를 보고 있으며 결과를 필터링하고 싶지만 어떻게 해야 할지 모르겠습니다.다음과 같은 내용의 텍스트 상자가 있습니다.

"반환된 엔티티를 제한하려면 WCF 데이터 서비스 필터를 입력하십시오."

"WCF 데이터 서비스 필터"의 구문은 무엇입니까?다음은 "지정한 값이 잘못되었습니다."라는 InvalidValueType 오류를 제공합니다.":

Timestamp gt '2011-04-20T00:00'

내가 가깝나요?어딘가에 편리한 구문 참조가 있습니까?

이 쿼리의 형식은 다음과 같습니다.

Timestamp gt datetime'2011-04-20T00:00:00'

그것을 말하는 것을 기억하는 것.datetime거기에 중요한 부분이 있습니다.

이것은 매번 저를 놀라게 하기 때문에 저는 OData 개요를 참고로 사용합니다.

knightffor의 응답에 추가하여 팀스탬프별로 필터링하는 쿼리를 작성할 수 있지만 "타임스탬프" 속성에 대한 쿼리는 전체 테이블 검색으로 이어지므로 권장되지 않는 접근 방식입니다.대신 PartitionKey 특성에 대해 이 테이블을 쿼리합니다.다른 스레드에서 응답을 복사하고 있습니다(Azure 웹/작업자 역할에 대한 성능 카운터를 원격으로 캡처할 수 있습니까...?):

"여기서 중요한 것 중 하나는 이 테이블(및 기타 진단 테이블)을 효과적으로 쿼리하는 방법을 이해하는 것입니다.진단 테이블에서 원하는 것 중 하나는 특정 기간 동안 데이터를 가져오는 것입니다.우리의 자연스러운 본능은 타임스탬프 속성에 대해 이 테이블을 쿼리하는 것입니다.그러나 Azure 테이블에서 데이터가 PartitionKey 및 RowKey에 인덱싱된다는 것을 알고 있기 때문에 이는 잘못된 설계 선택입니다.다른 속성을 쿼리하면 테이블에 많은 데이터가 포함된 경우 문제가 발생하는 전체 테이블 검색이 수행됩니다.이러한 로그 테이블의 좋은 점은 PartitionKey 값이 데이터 지점이 수집된 날짜/시간을 나타낸다는 것입니다.기본적으로 PartitionKey는 DateTime의 상위 비트를 사용하여 생성됩니다.눈금(UTC).따라서 특정 날짜/시간 범위에 대한 데이터를 가져오려면 먼저 범위에 대한 눈금(UTC)을 계산한 다음 앞에 "0"을 추가하고 쿼리에 해당 값을 사용해야 합니다.REST API를 사용하여 쿼리하는 경우 PartitionKey '0<UTC의 날짜/시간 눈금에서>' 및 PartitionKey '0<UTC의 날짜/시간으로>'와 같은 구문을 사용합니다.

저는 테이블 스토리지에 대해 WCF 쿼리를 작성하는 방법에 대해 블로그 게시물을 작성했는데, 유용할 수 있습니다.

또한 진단 데이터를 보고 관리하기 위한 타사 도구를 찾고 있는 경우 당사의 제품 Azure Diagnostics Manager: /Products/Azure Diagnostics Manager를 검토해 보는 것이 좋습니다.이 도구는 Windows Azure Diagnostics 데이터를 검색하고 관리하기 위해 특별히 제작되었습니다.

가 수락한 답변은 Visual Studio를 통해 테이블에 직접 문의하는 데 큰 도움이 되었습니다.하지만 결국에는 더 강력한 솔루션이 필요했습니다.여기서 얻은 팁을 사용하여 LINQ를 사용하여 테이블을 쿼리할 수 있는 C# 클래스를 개발했습니다.이 질문을 보는 다른 사람들에게 유용한 경우를 대비하여, 다음은 내 Azure 로그를 쿼리하는 대략적인 방법입니다.

에서 상속되는 클래스를 만들어 "WADLogsTable" 테이블의 모든 데이터를 나타냅니다.

public class AzureDiagnosticEntry : TableServiceEntity
{
    public long EventTickCount { get; set; }
    public string DeploymentId { get; set; }
    public string Role { get; set; }
    public string RoleInstance { get; set; }
    public int EventId { get; set; }
    public int Level { get; set; }
    public int Pid { get; set; }
    public int Tid { get; set; }
    public string Message { get; set; }
    public DateTime EventDateTime
    {
        get
        {
            return new DateTime(EventTickCount, DateTimeKind.Utc);
        }
    }
}

새로 정의된 데이터 개체 클래스를 상속하고 참조하는 클래스를 만듭니다.

public class AzureDiagnosticContext : TableServiceContext
{
    public AzureDiagnosticContext(string baseAddress, StorageCredentials credentials)
        : base(baseAddress, credentials)
    {
        this.ResolveType = s => typeof(AzureDiagnosticEntry);
    }

    public AzureDiagnosticContext(CloudStorageAccount storage)
        : this(storage.TableEndpoint.ToString(), storage.Credentials) { }

    // Helper method to get an IQueryable.  Hard code "WADLogsTable" for this class
    public IQueryable<AzureDiagnosticEntry> Logs
    {
        get
        {
            return CreateQuery<AzureDiagnosticEntry>("WADLogsTable");
        }
    }
}

구성 설정에서 를 생성하는 도우미 메서드가 있습니다.

public CloudStorageAccount GetStorageAccount()
{
    CloudStorageAccount.SetConfigurationSettingPublisher(
        (name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name)));
    string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";
    return CloudStorageAccount.FromConfigurationSetting(configKey);
}

다음을 만듭니다.AzureDiagnosticContext에서CloudStorageAccount로그를 쿼리하는 데 사용합니다.

public IEnumerable<AzureDiagnosticEntry> GetAzureLog(DateTime start, DateTime end)
{
    CloudStorageAccount storage = GetStorageAccount();
    AzureDiagnosticContext context = new AzureDiagnosticContext(storage);
    string startTicks = "0" + start.Ticks;
    string endTicks = "0" + end.Ticks;
    IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
        e => e.PartitionKey.CompareTo(startTicks) > 0 &&
             e.PartitionKey.CompareTo(endTicks) < 0);
    CloudTableQuery<AzureDiagnosticEntry> tableQuery = query.AsTableServiceQuery();
    IEnumerable<AzureDiagnosticEntry> results = tableQuery.Execute();
    return results;
}

이 메서드는 Gaurav의 응답에 있는 성능 팁을 활용하여 필터링합니다.PartitionKey보다는Timestamp.

날짜 이상으로 결과를 필터링하려면 반환된 결과를 필터링할 수 있습니다.IEnumerable그러나, 당신은 아마도 그것을 필터링함으로써 더 나은 성능을 얻을 것입니다.IQueryable메서드에 필터 매개 변수를 추가하고 다음과 같이 호출할 수 있습니다.IQueryable.Where()예,

public IEnumerable<AzureDiagnosticEntry> GetAzureLog(
    DateTime start, DateTime end, Func<AzureDiagnosticEntry, bool> filter)
{
    ...
    IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
        e => e.PartitionKey.CompareTo(startTicks) > 0 &&
             e.PartitionKey.CompareTo(endTicks) < 0 &&
             filter(e));
    ...
}

마지막으로 Windows 이벤트 로그를 저장하는 것과 같은 다른 테이블을 쿼리하는 기능을 다시 사용하기 위해 이러한 클래스의 대부분을 기본 클래스로 추상화했습니다.

언급URL : https://stackoverflow.com/questions/5737343/how-to-filter-azure-logs-or-wcf-data-services-filters-for-dummies

반응형