Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions sdk/data/azcosmos/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,31 @@ You can create an Azure Cosmos account using:

In order to interact with the Azure Cosmos DB service you'll need to create an instance of the Cosmos client class. To make this possible you will need an URL and key of the Azure Cosmos DB service.

#### Logging

The SDK can make use of `azcore`'s logging implementation to collect useful information for debugging your application. In order to make use of logs, one must set the environment variable `"AZURE_SDK_GO_LOGGING"` to `"all"` like outlined in this [public document](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#hdr-Built_in_Logging).

Once that is done, the SDK will begin to collect diagnostics. By default, it will output the logs to `stdout` - printing directly to your console - and will record all types of events (requests, responses, retries). If you'd like to configure a listener that acts differently, the small snippet below shows how you could do so.

```go
import (
"os"
azlog "github.com/Azure/azure-sdk-for-go/sdk/azcore/log"
)

f, err := os.Create("cosmos-log-file.txt")
handle(err)
defer f.Close()

// Configure the listener to write to a file rather than to the console
azlog.SetListener(func(event azlog.Event, s string) {
f.WriteString(s + "\n")
})

// Filter the types of events you'd like to log by removing the ones you're not interested in
azlog.SetEvents(azlog.EventRequest, azlog.EventResponse, azlog.EventRetryPolicy)
```

## Examples

The following section provides several code snippets covering some of the most common Cosmos DB SQL API tasks, including:
Expand Down
81 changes: 79 additions & 2 deletions sdk/data/azcosmos/cosmos_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ func newPipeline(authPolicy policy.Policy, gem *globalEndpointManager, options *
if options == nil {
options = &ClientOptions{}
}

return azruntime.NewPipeline("azcosmos", serviceLibVersion,
azruntime.PipelineOptions{
AllowedHeaders: getAllowedHeaders(),
PerCall: []policy.Policy{
&headerPolicies{
enableContentResponseOnWrite: options.EnableContentResponseOnWrite,
Expand All @@ -135,6 +135,7 @@ func newInternalPipeline(authPolicy policy.Policy, options *ClientOptions) azrun
}
return azruntime.NewPipeline("azcosmos", serviceLibVersion,
azruntime.PipelineOptions{
AllowedHeaders: getAllowedHeaders(),
PerRetry: []policy.Policy{
authPolicy,
},
Expand Down Expand Up @@ -471,7 +472,7 @@ func (c *Client) executeAndEnsureSuccessResponse(request *policy.Request) (*http
return response, nil
}

return nil, newCosmosError(response)
return nil, azruntime.NewResponseErrorWithErrorCode(response, response.Status)
}

type pipelineRequestOptions struct {
Expand All @@ -481,3 +482,79 @@ type pipelineRequestOptions struct {
isRidBased bool
isWriteOperation bool
}

func getAllowedHeaders() []string {
return []string{
cosmosHeaderRequestCharge,
cosmosHeaderActivityId,
cosmosHeaderEtag,
cosmosHeaderSubstatus,
cosmosHeaderPopulateQuotaInfo,
cosmosHeaderPreTriggerInclude,
cosmosHeaderPostTriggerInclude,
cosmosHeaderIndexingDirective,
cosmosHeaderSessionToken,
cosmosHeaderConsistencyLevel,
cosmosHeaderPrefer,
cosmosHeaderIsUpsert,
cosmosHeaderOfferThroughput,
cosmosHeaderOfferAutoscale,
cosmosHeaderQuery,
cosmosHeaderOfferReplacePending,
cosmosHeaderOfferMinimumThroughput,
cosmosHeaderResponseContinuationTokenLimitInKb,
cosmosHeaderEnableScanInQuery,
cosmosHeaderMaxItemCount,
cosmosHeaderContinuationToken,
cosmosHeaderPopulateIndexMetrics,
cosmosHeaderPopulateQueryMetrics,
cosmosHeaderQueryMetrics,
cosmosHeaderIndexUtilization,
cosmosHeaderCorrelatedActivityId,
cosmosHeaderIsBatchRequest,
cosmosHeaderIsBatchAtomic,
cosmosHeaderIsBatchOrdered,
cosmosHeaderSDKSupportedCapabilities,
headerXmsDate,
headerContentType,
headerIfMatch,
headerIfNoneMatch,
headerXmsVersion,
headerContentLocation,
headerXmsGatewayVersion,
headerLsn,
headerXmsCosmosLlsn,
headerXmsCosmosItemLlsn,
headerXmsItemLsn,
headerXmsCosmosQuorumAckedLlsn,
headerXmsCurrentReplicaSetSize,
headerXmsCurrentWriteQuorum,
headerXmsGlobalCommittedLsn,
headerXmsLastStateChangeUtc,
headerXmsNumberOfReadRegions,
headerXmsQuorumAckedLsn,
headerXmsRequestDurationMs,
headerXmsResourceQuota,
headerXmsResourceUsage,
headerXmsSchemaVersion,
headerXmsServiceVersion,
headerXmsTransportRequestId,
headerXmsXpRole,
headerCollectionPartitionIndex,
headerCollectionServiceIndex,
headerXmsDocumentDbPartitionKeyRangeId,
cosmosHeaderPhysicalPartitionId,
headerStrictTransportSecurity,
headerXmsDatabaseAccountConsumedMb,
headerXmsDatabaseAccountProvisionedMb,
headerXmsDatabaseAccountReservedMb,
headerXmsMaxMediaStorageUsageMb,
headerXmsMediaStorageUsageMb,
headerXmsContentPath,
headerXmsAltContentPath,
cosmosHeaderMaxContentLength,
cosmosHeaderIsPartitionKeyDeletePending,
cosmosHeaderQueryExecutionInfo,
headerXmsItemCount,
}
}
8 changes: 3 additions & 5 deletions sdk/data/azcosmos/cosmos_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,7 @@ func TestNewClientFromConnStrSuccess(t *testing.T) {
}

func TestEnsureErrorIsGeneratedOnResponse(t *testing.T) {
someError := &cosmosErrorResponse{
Code: "SomeCode",
}
someError := map[string]string{"Code": "SomeCode"}

jsonString, err := json.Marshal(someError)
if err != nil {
Expand All @@ -102,8 +100,8 @@ func TestEnsureErrorIsGeneratedOnResponse(t *testing.T) {
}

asError := err.(*azcore.ResponseError)
if asError.ErrorCode != someError.Code {
t.Errorf("Expected %v, but got %v", someError.Code, asError.ErrorCode)
if asError.ErrorCode != "404 Not Found" {
t.Errorf("Expected %v, but got %v", "404 Not Found", asError.ErrorCode)
}

if err.Error() != asError.Error() {
Expand Down
37 changes: 0 additions & 37 deletions sdk/data/azcosmos/cosmos_error.go

This file was deleted.

19 changes: 10 additions & 9 deletions sdk/data/azcosmos/cosmos_error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
azruntime "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
"github.com/Azure/azure-sdk-for-go/sdk/internal/mock"
"github.com/stretchr/testify/assert"
)

func TestCosmosErrorOnEmptyResponse(t *testing.T) {
Expand All @@ -32,13 +33,13 @@ func TestCosmosErrorOnEmptyResponse(t *testing.T) {
resp, _ := pl.Do(req)

var azErr *azcore.ResponseError
if err := newCosmosError(resp); !errors.As(err, &azErr) {
if err := azruntime.NewResponseErrorWithErrorCode(resp, resp.Status); !errors.As(err, &azErr) {
t.Fatalf("unexpected error type %T", err)
}
if azErr.StatusCode != http.StatusNotFound {
t.Errorf("unexpected status code %d", azErr.StatusCode)
}
if azErr.ErrorCode != "" {
if azErr.ErrorCode != "404 Not Found" {
t.Errorf("unexpected error code %s", azErr.ErrorCode)
}
if azErr.RawResponse == nil {
Expand All @@ -62,13 +63,13 @@ func TestCosmosErrorOnNonJsonBody(t *testing.T) {
resp, _ := pl.Do(req)

var azErr *azcore.ResponseError
if err := newCosmosError(resp); !errors.As(err, &azErr) {
if err := azruntime.NewResponseErrorWithErrorCode(resp, resp.Status); !errors.As(err, &azErr) {
t.Fatalf("unexpected error type %T", err)
}
if azErr.StatusCode != http.StatusNotFound {
t.Errorf("unexpected status code %d", azErr.StatusCode)
}
if azErr.ErrorCode != "" {
if azErr.ErrorCode != "404 Not Found" {
t.Errorf("unexpected error code %s", azErr.ErrorCode)
}
if azErr.RawResponse == nil {
Expand All @@ -80,9 +81,7 @@ func TestCosmosErrorOnNonJsonBody(t *testing.T) {
}

func TestCosmosErrorOnJsonBody(t *testing.T) {
someError := &cosmosErrorResponse{
Code: "SomeCode",
}
someError := map[string]string{"Code": "SomeCode"}

jsonString, err := json.Marshal(someError)
if err != nil {
Expand All @@ -104,13 +103,15 @@ func TestCosmosErrorOnJsonBody(t *testing.T) {
resp, _ := pl.Do(req)

var azErr *azcore.ResponseError
if err := newCosmosError(resp); !errors.As(err, &azErr) {
err2 := azruntime.NewResponseErrorWithErrorCode(resp, resp.Status)
assert.Error(t, err2)
if err := azruntime.NewResponseErrorWithErrorCode(resp, resp.Status); !errors.As(err, &azErr) {
t.Fatalf("unexpected error type %T", err)
}
if azErr.StatusCode != http.StatusNotFound {
t.Errorf("unexpected status code %d", azErr.StatusCode)
}
if azErr.ErrorCode != someError.Code {
if azErr.ErrorCode != "404 Not Found" {
t.Errorf("unexpected error code %s", azErr.ErrorCode)
}
if azErr.RawResponse == nil {
Expand Down
2 changes: 1 addition & 1 deletion sdk/data/azcosmos/cosmos_global_endpoint_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func (gem *globalEndpointManager) GetAccountProperties(ctx context.Context) (acc
return properties, nil
}

return accountProperties{}, newCosmosError(azResponse)
return accountProperties{}, azruntime.NewResponseErrorWithErrorCode(azResponse, azResponse.Status)
}

func newAccountProperties(azResponse *http.Response) (accountProperties, error) {
Expand Down
37 changes: 37 additions & 0 deletions sdk/data/azcosmos/cosmos_headers.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const (
cosmosHeaderRequestCharge string = "x-ms-request-charge"
cosmosHeaderActivityId string = "x-ms-activity-id"
cosmosHeaderEtag string = "etag"
cosmosHeaderSubstatus string = "x-ms-substatus"
cosmosHeaderPopulateQuotaInfo string = "x-ms-documentdb-populatequotainfo"
cosmosHeaderPreTriggerInclude string = "x-ms-documentdb-pre-trigger-include"
cosmosHeaderPostTriggerInclude string = "x-ms-documentdb-post-trigger-include"
Expand Down Expand Up @@ -40,6 +41,42 @@ const (
headerIfMatch string = "If-Match"
headerIfNoneMatch string = "If-None-Match"
headerXmsVersion string = "x-ms-version"
headerContentLocation string = "content-location"
headerXmsGatewayVersion string = "x-ms-gatewayversion"
headerLsn string = "lsn"
headerXmsCosmosLlsn string = "x-ms-cosmos-llsn"
headerXmsCosmosItemLlsn string = "x-ms-cosmos-item-llsn"
headerXmsItemLsn string = "x-ms-item-lsn"
headerXmsCosmosQuorumAckedLlsn string = "x-ms-cosmos-quorum-acked-llsn"
headerXmsCurrentReplicaSetSize string = "x-ms-current-replica-set-size"
headerXmsCurrentWriteQuorum string = "x-ms-current-write-quorum"
headerXmsGlobalCommittedLsn string = "x-ms-global-committed-lsn"
headerXmsLastStateChangeUtc string = "x-ms-last-state-change-utc"
headerXmsNumberOfReadRegions string = "x-ms-number-of-read-regions"
headerXmsQuorumAckedLsn string = "x-ms-quorum-acked-lsn"
headerXmsRequestDurationMs string = "x-ms-request-duration-ms"
headerXmsResourceQuota string = "x-ms-resource-quota"
headerXmsResourceUsage string = "x-ms-resource-usage"
headerXmsSchemaVersion string = "x-ms-schemaversion"
headerXmsServiceVersion string = "x-ms-serviceversion"
headerXmsTransportRequestId string = "x-ms-transport-request-id"
headerXmsXpRole string = "x-ms-xp-role"
headerCollectionPartitionIndex string = "collection-partition-index"
headerCollectionServiceIndex string = "collection-service-index"
headerXmsDocumentDbPartitionKeyRangeId string = "x-ms-documentdb-partitionkeyrangeid"
cosmosHeaderPhysicalPartitionId string = "x-ms-cosmos-physical-partition-id"
headerStrictTransportSecurity string = "strict-transport-security"
headerXmsDatabaseAccountConsumedMb string = "x-ms-databaseaccount-consumed-mb"
headerXmsDatabaseAccountProvisionedMb string = "x-ms-databaseaccount-provisioned-mb"
headerXmsDatabaseAccountReservedMb string = "x-ms-databaseaccount-reserved-mb"
headerXmsMaxMediaStorageUsageMb string = "x-ms-max-media-storage-usage-mb"
headerXmsMediaStorageUsageMb string = "x-ms-media-storage-usage-mb"
headerXmsContentPath string = "x-ms-content-path"
headerXmsAltContentPath string = "x-ms-alt-content-path"
cosmosHeaderMaxContentLength string = "x-ms-cosmos-max-content-length"
cosmosHeaderIsPartitionKeyDeletePending string = "x-ms-cosmos-is-partition-key-delete-pending"
cosmosHeaderQueryExecutionInfo string = "x-ms-cosmos-query-execution-info"
headerXmsItemCount string = "x-ms-item-count"
)

const (
Expand Down
2 changes: 1 addition & 1 deletion sdk/data/azcosmos/cosmos_offers.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func (c cosmosOffers) ReadThroughputIfExists(
if len(theOffers.Offers) == 0 {
azResponse.StatusCode = http.StatusNotFound
azResponse.Header.Add(cosmosHeaderRequestCharge, fmt.Sprint(queryRequestCharge))
return ThroughputResponse{}, newCosmosError(azResponse)
return ThroughputResponse{}, azruntime.NewResponseErrorWithErrorCode(azResponse, azResponse.Status)
}

// Now read the individual offer
Expand Down
12 changes: 7 additions & 5 deletions sdk/data/azcosmos/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0
github.com/Azure/azure-sdk-for-go/sdk/internal v1.4.0
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2
github.com/stretchr/testify v1.8.4
)

Expand All @@ -18,9 +18,11 @@ require (
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/crypto v0.18.0 // indirect
golang.org/x/net v0.20.0 // indirect
golang.org/x/sys v0.16.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

replace github.com/Azure/azure-sdk-for-go/sdk/azcore => github.com/jhendrixMSFT/azure-sdk-for-go/sdk/azcore v1.0.1-0.20240220220945-83431d5f3cb9
Loading