Просмотр исходного кода

Change persistent stats tactics flags to probabilities to support sampling

- failed_tunnel now defaults to off
Rod Hynes 7 лет назад
Родитель
Сommit
94b7540fe4
2 измененных файлов с 147 добавлено и 147 удалено
  1. 143 143
      psiphon/common/parameters/clientParameters.go
  2. 4 4
      psiphon/serverApi.go

+ 143 - 143
psiphon/common/parameters/clientParameters.go

@@ -67,145 +67,145 @@ import (
 )
 )
 
 
 const (
 const (
-	NetworkLatencyMultiplier                   = "NetworkLatencyMultiplier"
-	TacticsWaitPeriod                          = "TacticsWaitPeriod"
-	TacticsRetryPeriod                         = "TacticsRetryPeriod"
-	TacticsRetryPeriodJitter                   = "TacticsRetryPeriodJitter"
-	TacticsTimeout                             = "TacticsTimeout"
-	ConnectionWorkerPoolSize                   = "ConnectionWorkerPoolSize"
-	TunnelConnectTimeout                       = "TunnelConnectTimeout"
-	EstablishTunnelTimeout                     = "EstablishTunnelTimeout"
-	EstablishTunnelWorkTime                    = "EstablishTunnelWorkTime"
-	EstablishTunnelPausePeriod                 = "EstablishTunnelPausePeriod"
-	EstablishTunnelPausePeriodJitter           = "EstablishTunnelPausePeriodJitter"
-	EstablishTunnelServerAffinityGracePeriod   = "EstablishTunnelServerAffinityGracePeriod"
-	StaggerConnectionWorkersPeriod             = "StaggerConnectionWorkersPeriod"
-	StaggerConnectionWorkersJitter             = "StaggerConnectionWorkersJitter"
-	LimitIntensiveConnectionWorkers            = "LimitIntensiveConnectionWorkers"
-	IgnoreHandshakeStatsRegexps                = "IgnoreHandshakeStatsRegexps"
-	PrioritizeTunnelProtocolsProbability       = "PrioritizeTunnelProtocolsProbability"
-	PrioritizeTunnelProtocols                  = "PrioritizeTunnelProtocols"
-	PrioritizeTunnelProtocolsCandidateCount    = "PrioritizeTunnelProtocolsCandidateCount"
-	InitialLimitTunnelProtocolsProbability     = "InitialLimitTunnelProtocolsProbability"
-	InitialLimitTunnelProtocols                = "InitialLimitTunnelProtocols"
-	InitialLimitTunnelProtocolsCandidateCount  = "InitialLimitTunnelProtocolsCandidateCount"
-	LimitTunnelProtocolsProbability            = "LimitTunnelProtocolsProbability"
-	LimitTunnelProtocols                       = "LimitTunnelProtocols"
-	LimitTLSProfilesProbability                = "LimitTLSProfilesProbability"
-	LimitTLSProfiles                           = "LimitTLSProfiles"
-	LimitQUICVersionsProbability               = "LimitQUICVersionsProbability"
-	LimitQUICVersions                          = "LimitQUICVersions"
-	FragmentorProbability                      = "FragmentorProbability"
-	FragmentorLimitProtocols                   = "FragmentorLimitProtocols"
-	FragmentorMinTotalBytes                    = "FragmentorMinTotalBytes"
-	FragmentorMaxTotalBytes                    = "FragmentorMaxTotalBytes"
-	FragmentorMinWriteBytes                    = "FragmentorMinWriteBytes"
-	FragmentorMaxWriteBytes                    = "FragmentorMaxWriteBytes"
-	FragmentorMinDelay                         = "FragmentorMinDelay"
-	FragmentorMaxDelay                         = "FragmentorMaxDelay"
-	FragmentorDownstreamProbability            = "FragmentorDownstreamProbability"
-	FragmentorDownstreamLimitProtocols         = "FragmentorDownstreamLimitProtocols"
-	FragmentorDownstreamMinTotalBytes          = "FragmentorDownstreamMinTotalBytes"
-	FragmentorDownstreamMaxTotalBytes          = "FragmentorDownstreamMaxTotalBytes"
-	FragmentorDownstreamMinWriteBytes          = "FragmentorDownstreamMinWriteBytes"
-	FragmentorDownstreamMaxWriteBytes          = "FragmentorDownstreamMaxWriteBytes"
-	FragmentorDownstreamMinDelay               = "FragmentorDownstreamMinDelay"
-	FragmentorDownstreamMaxDelay               = "FragmentorDownstreamMaxDelay"
-	ObfuscatedSSHMinPadding                    = "ObfuscatedSSHMinPadding"
-	ObfuscatedSSHMaxPadding                    = "ObfuscatedSSHMaxPadding"
-	TunnelOperateShutdownTimeout               = "TunnelOperateShutdownTimeout"
-	TunnelPortForwardDialTimeout               = "TunnelPortForwardDialTimeout"
-	TunnelRateLimits                           = "TunnelRateLimits"
-	AdditionalCustomHeaders                    = "AdditionalCustomHeaders"
-	SpeedTestPaddingMinBytes                   = "SpeedTestPaddingMinBytes"
-	SpeedTestPaddingMaxBytes                   = "SpeedTestPaddingMaxBytes"
-	SpeedTestMaxSampleCount                    = "SpeedTestMaxSampleCount"
-	SSHKeepAliveSpeedTestSampleProbability     = "SSHKeepAliveSpeedTestSampleProbability"
-	SSHKeepAlivePaddingMinBytes                = "SSHKeepAlivePaddingMinBytes"
-	SSHKeepAlivePaddingMaxBytes                = "SSHKeepAlivePaddingMaxBytes"
-	SSHKeepAlivePeriodMin                      = "SSHKeepAlivePeriodMin"
-	SSHKeepAlivePeriodMax                      = "SSHKeepAlivePeriodMax"
-	SSHKeepAlivePeriodicTimeout                = "SSHKeepAlivePeriodicTimeout"
-	SSHKeepAlivePeriodicInactivePeriod         = "SSHKeepAlivePeriodicInactivePeriod"
-	SSHKeepAliveProbeTimeout                   = "SSHKeepAliveProbeTimeout"
-	SSHKeepAliveProbeInactivePeriod            = "SSHKeepAliveProbeInactivePeriod"
-	HTTPProxyOriginServerTimeout               = "HTTPProxyOriginServerTimeout"
-	HTTPProxyMaxIdleConnectionsPerHost         = "HTTPProxyMaxIdleConnectionsPerHost"
-	FetchRemoteServerListTimeout               = "FetchRemoteServerListTimeout"
-	FetchRemoteServerListRetryPeriod           = "FetchRemoteServerListRetryPeriod"
-	FetchRemoteServerListStalePeriod           = "FetchRemoteServerListStalePeriod"
-	RemoteServerListSignaturePublicKey         = "RemoteServerListSignaturePublicKey"
-	RemoteServerListURLs                       = "RemoteServerListURLs"
-	ObfuscatedServerListRootURLs               = "ObfuscatedServerListRootURLs"
-	PsiphonAPIRequestTimeout                   = "PsiphonAPIRequestTimeout"
-	PsiphonAPIStatusRequestPeriodMin           = "PsiphonAPIStatusRequestPeriodMin"
-	PsiphonAPIStatusRequestPeriodMax           = "PsiphonAPIStatusRequestPeriodMax"
-	PsiphonAPIStatusRequestShortPeriodMin      = "PsiphonAPIStatusRequestShortPeriodMin"
-	PsiphonAPIStatusRequestShortPeriodMax      = "PsiphonAPIStatusRequestShortPeriodMax"
-	PsiphonAPIStatusRequestPaddingMinBytes     = "PsiphonAPIStatusRequestPaddingMinBytes"
-	PsiphonAPIStatusRequestPaddingMaxBytes     = "PsiphonAPIStatusRequestPaddingMaxBytes"
-	PsiphonAPIPersistentStatsMaxCount          = "PsiphonAPIPersistentStatsMaxCount"
-	PsiphonAPIConnectedRequestPeriod           = "PsiphonAPIConnectedRequestPeriod"
-	PsiphonAPIConnectedRequestRetryPeriod      = "PsiphonAPIConnectedRequestRetryPeriod"
-	FetchSplitTunnelRoutesTimeout              = "FetchSplitTunnelRoutesTimeout"
-	SplitTunnelRoutesURLFormat                 = "SplitTunnelRoutesURLFormat"
-	SplitTunnelRoutesSignaturePublicKey        = "SplitTunnelRoutesSignaturePublicKey"
-	SplitTunnelDNSServer                       = "SplitTunnelDNSServer"
-	FetchUpgradeTimeout                        = "FetchUpgradeTimeout"
-	FetchUpgradeRetryPeriod                    = "FetchUpgradeRetryPeriod"
-	FetchUpgradeStalePeriod                    = "FetchUpgradeStalePeriod"
-	UpgradeDownloadURLs                        = "UpgradeDownloadURLs"
-	UpgradeDownloadClientVersionHeader         = "UpgradeDownloadClientVersionHeader"
-	TotalBytesTransferredNoticePeriod          = "TotalBytesTransferredNoticePeriod"
-	MeekDialDomainsOnly                        = "MeekDialDomainsOnly"
-	MeekLimitBufferSizes                       = "MeekLimitBufferSizes"
-	MeekCookieMaxPadding                       = "MeekCookieMaxPadding"
-	MeekFullReceiveBufferLength                = "MeekFullReceiveBufferLength"
-	MeekReadPayloadChunkLength                 = "MeekReadPayloadChunkLength"
-	MeekLimitedFullReceiveBufferLength         = "MeekLimitedFullReceiveBufferLength"
-	MeekLimitedReadPayloadChunkLength          = "MeekLimitedReadPayloadChunkLength"
-	MeekMinPollInterval                        = "MeekMinPollInterval"
-	MeekMinPollIntervalJitter                  = "MeekMinPollIntervalJitter"
-	MeekMaxPollInterval                        = "MeekMaxPollInterval"
-	MeekMaxPollIntervalJitter                  = "MeekMaxPollIntervalJitter"
-	MeekPollIntervalMultiplier                 = "MeekPollIntervalMultiplier"
-	MeekPollIntervalJitter                     = "MeekPollIntervalJitter"
-	MeekApplyPollIntervalMultiplierProbability = "MeekApplyPollIntervalMultiplierProbability"
-	MeekRoundTripRetryDeadline                 = "MeekRoundTripRetryDeadline"
-	MeekRoundTripRetryMinDelay                 = "MeekRoundTripRetryMinDelay"
-	MeekRoundTripRetryMaxDelay                 = "MeekRoundTripRetryMaxDelay"
-	MeekRoundTripRetryMultiplier               = "MeekRoundTripRetryMultiplier"
-	MeekRoundTripTimeout                       = "MeekRoundTripTimeout"
-	TransformHostNameProbability               = "TransformHostNameProbability"
-	PickUserAgentProbability                   = "PickUserAgentProbability"
-	LivenessTestMinUpstreamBytes               = "LivenessTestMinUpstreamBytes"
-	LivenessTestMaxUpstreamBytes               = "LivenessTestMaxUpstreamBytes"
-	LivenessTestMinDownstreamBytes             = "LivenessTestMinDownstreamBytes"
-	LivenessTestMaxDownstreamBytes             = "LivenessTestMaxDownstreamBytes"
-	ReplayCandidateCount                       = "ReplayCandidateCount"
-	ReplayDialParametersTTL                    = "ReplayDialParametersTTL"
-	ReplayTargetUpstreamBytes                  = "ReplayTargetUpstreamBytes"
-	ReplayTargetDownstreamBytes                = "ReplayTargetDownstreamBytes"
-	ReplaySSH                                  = "ReplaySSH"
-	ReplayObfuscatorPadding                    = "ReplayObfuscatorPadding"
-	ReplayFragmentor                           = "ReplayFragmentor"
-	ReplayTLSProfile                           = "ReplayTLSProfile"
-	ReplayRandomizedTLSProfile                 = "ReplayRandomizedTLSProfile"
-	ReplayFronting                             = "ReplayFronting"
-	ReplayHostname                             = "ReplayHostname"
-	ReplayQUICVersion                          = "ReplayQUICVersion"
-	ReplayObfuscatedQUIC                       = "ReplayObfuscatedQUIC"
-	ReplayLivenessTest                         = "ReplayLivenessTest"
-	ReplayUserAgent                            = "ReplayUserAgent"
-	ReplayAPIRequestPadding                    = "ReplayAPIRequestPadding"
-	APIRequestUpstreamPaddingMinBytes          = "APIRequestUpstreamPaddingMinBytes"
-	APIRequestUpstreamPaddingMaxBytes          = "APIRequestUpstreamPaddingMaxBytes"
-	APIRequestDownstreamPaddingMinBytes        = "APIRequestDownstreamPaddingMinBytes"
-	APIRequestDownstreamPaddingMaxBytes        = "APIRequestDownstreamPaddingMaxBytes"
-	PersistentStatsMaxStoreRecords             = "PersistentStatsMaxStoreRecords"
-	PersistentStatsMaxSendBytes                = "PersistentStatsMaxSendBytes"
-	RecordRemoteServerListPersistentStats      = "RecordRemoteServerListPersistentStats"
-	RecordFailedTunnelPersistentStats          = "RecordFailedTunnelPersistentStats"
+	NetworkLatencyMultiplier                         = "NetworkLatencyMultiplier"
+	TacticsWaitPeriod                                = "TacticsWaitPeriod"
+	TacticsRetryPeriod                               = "TacticsRetryPeriod"
+	TacticsRetryPeriodJitter                         = "TacticsRetryPeriodJitter"
+	TacticsTimeout                                   = "TacticsTimeout"
+	ConnectionWorkerPoolSize                         = "ConnectionWorkerPoolSize"
+	TunnelConnectTimeout                             = "TunnelConnectTimeout"
+	EstablishTunnelTimeout                           = "EstablishTunnelTimeout"
+	EstablishTunnelWorkTime                          = "EstablishTunnelWorkTime"
+	EstablishTunnelPausePeriod                       = "EstablishTunnelPausePeriod"
+	EstablishTunnelPausePeriodJitter                 = "EstablishTunnelPausePeriodJitter"
+	EstablishTunnelServerAffinityGracePeriod         = "EstablishTunnelServerAffinityGracePeriod"
+	StaggerConnectionWorkersPeriod                   = "StaggerConnectionWorkersPeriod"
+	StaggerConnectionWorkersJitter                   = "StaggerConnectionWorkersJitter"
+	LimitIntensiveConnectionWorkers                  = "LimitIntensiveConnectionWorkers"
+	IgnoreHandshakeStatsRegexps                      = "IgnoreHandshakeStatsRegexps"
+	PrioritizeTunnelProtocolsProbability             = "PrioritizeTunnelProtocolsProbability"
+	PrioritizeTunnelProtocols                        = "PrioritizeTunnelProtocols"
+	PrioritizeTunnelProtocolsCandidateCount          = "PrioritizeTunnelProtocolsCandidateCount"
+	InitialLimitTunnelProtocolsProbability           = "InitialLimitTunnelProtocolsProbability"
+	InitialLimitTunnelProtocols                      = "InitialLimitTunnelProtocols"
+	InitialLimitTunnelProtocolsCandidateCount        = "InitialLimitTunnelProtocolsCandidateCount"
+	LimitTunnelProtocolsProbability                  = "LimitTunnelProtocolsProbability"
+	LimitTunnelProtocols                             = "LimitTunnelProtocols"
+	LimitTLSProfilesProbability                      = "LimitTLSProfilesProbability"
+	LimitTLSProfiles                                 = "LimitTLSProfiles"
+	LimitQUICVersionsProbability                     = "LimitQUICVersionsProbability"
+	LimitQUICVersions                                = "LimitQUICVersions"
+	FragmentorProbability                            = "FragmentorProbability"
+	FragmentorLimitProtocols                         = "FragmentorLimitProtocols"
+	FragmentorMinTotalBytes                          = "FragmentorMinTotalBytes"
+	FragmentorMaxTotalBytes                          = "FragmentorMaxTotalBytes"
+	FragmentorMinWriteBytes                          = "FragmentorMinWriteBytes"
+	FragmentorMaxWriteBytes                          = "FragmentorMaxWriteBytes"
+	FragmentorMinDelay                               = "FragmentorMinDelay"
+	FragmentorMaxDelay                               = "FragmentorMaxDelay"
+	FragmentorDownstreamProbability                  = "FragmentorDownstreamProbability"
+	FragmentorDownstreamLimitProtocols               = "FragmentorDownstreamLimitProtocols"
+	FragmentorDownstreamMinTotalBytes                = "FragmentorDownstreamMinTotalBytes"
+	FragmentorDownstreamMaxTotalBytes                = "FragmentorDownstreamMaxTotalBytes"
+	FragmentorDownstreamMinWriteBytes                = "FragmentorDownstreamMinWriteBytes"
+	FragmentorDownstreamMaxWriteBytes                = "FragmentorDownstreamMaxWriteBytes"
+	FragmentorDownstreamMinDelay                     = "FragmentorDownstreamMinDelay"
+	FragmentorDownstreamMaxDelay                     = "FragmentorDownstreamMaxDelay"
+	ObfuscatedSSHMinPadding                          = "ObfuscatedSSHMinPadding"
+	ObfuscatedSSHMaxPadding                          = "ObfuscatedSSHMaxPadding"
+	TunnelOperateShutdownTimeout                     = "TunnelOperateShutdownTimeout"
+	TunnelPortForwardDialTimeout                     = "TunnelPortForwardDialTimeout"
+	TunnelRateLimits                                 = "TunnelRateLimits"
+	AdditionalCustomHeaders                          = "AdditionalCustomHeaders"
+	SpeedTestPaddingMinBytes                         = "SpeedTestPaddingMinBytes"
+	SpeedTestPaddingMaxBytes                         = "SpeedTestPaddingMaxBytes"
+	SpeedTestMaxSampleCount                          = "SpeedTestMaxSampleCount"
+	SSHKeepAliveSpeedTestSampleProbability           = "SSHKeepAliveSpeedTestSampleProbability"
+	SSHKeepAlivePaddingMinBytes                      = "SSHKeepAlivePaddingMinBytes"
+	SSHKeepAlivePaddingMaxBytes                      = "SSHKeepAlivePaddingMaxBytes"
+	SSHKeepAlivePeriodMin                            = "SSHKeepAlivePeriodMin"
+	SSHKeepAlivePeriodMax                            = "SSHKeepAlivePeriodMax"
+	SSHKeepAlivePeriodicTimeout                      = "SSHKeepAlivePeriodicTimeout"
+	SSHKeepAlivePeriodicInactivePeriod               = "SSHKeepAlivePeriodicInactivePeriod"
+	SSHKeepAliveProbeTimeout                         = "SSHKeepAliveProbeTimeout"
+	SSHKeepAliveProbeInactivePeriod                  = "SSHKeepAliveProbeInactivePeriod"
+	HTTPProxyOriginServerTimeout                     = "HTTPProxyOriginServerTimeout"
+	HTTPProxyMaxIdleConnectionsPerHost               = "HTTPProxyMaxIdleConnectionsPerHost"
+	FetchRemoteServerListTimeout                     = "FetchRemoteServerListTimeout"
+	FetchRemoteServerListRetryPeriod                 = "FetchRemoteServerListRetryPeriod"
+	FetchRemoteServerListStalePeriod                 = "FetchRemoteServerListStalePeriod"
+	RemoteServerListSignaturePublicKey               = "RemoteServerListSignaturePublicKey"
+	RemoteServerListURLs                             = "RemoteServerListURLs"
+	ObfuscatedServerListRootURLs                     = "ObfuscatedServerListRootURLs"
+	PsiphonAPIRequestTimeout                         = "PsiphonAPIRequestTimeout"
+	PsiphonAPIStatusRequestPeriodMin                 = "PsiphonAPIStatusRequestPeriodMin"
+	PsiphonAPIStatusRequestPeriodMax                 = "PsiphonAPIStatusRequestPeriodMax"
+	PsiphonAPIStatusRequestShortPeriodMin            = "PsiphonAPIStatusRequestShortPeriodMin"
+	PsiphonAPIStatusRequestShortPeriodMax            = "PsiphonAPIStatusRequestShortPeriodMax"
+	PsiphonAPIStatusRequestPaddingMinBytes           = "PsiphonAPIStatusRequestPaddingMinBytes"
+	PsiphonAPIStatusRequestPaddingMaxBytes           = "PsiphonAPIStatusRequestPaddingMaxBytes"
+	PsiphonAPIPersistentStatsMaxCount                = "PsiphonAPIPersistentStatsMaxCount"
+	PsiphonAPIConnectedRequestPeriod                 = "PsiphonAPIConnectedRequestPeriod"
+	PsiphonAPIConnectedRequestRetryPeriod            = "PsiphonAPIConnectedRequestRetryPeriod"
+	FetchSplitTunnelRoutesTimeout                    = "FetchSplitTunnelRoutesTimeout"
+	SplitTunnelRoutesURLFormat                       = "SplitTunnelRoutesURLFormat"
+	SplitTunnelRoutesSignaturePublicKey              = "SplitTunnelRoutesSignaturePublicKey"
+	SplitTunnelDNSServer                             = "SplitTunnelDNSServer"
+	FetchUpgradeTimeout                              = "FetchUpgradeTimeout"
+	FetchUpgradeRetryPeriod                          = "FetchUpgradeRetryPeriod"
+	FetchUpgradeStalePeriod                          = "FetchUpgradeStalePeriod"
+	UpgradeDownloadURLs                              = "UpgradeDownloadURLs"
+	UpgradeDownloadClientVersionHeader               = "UpgradeDownloadClientVersionHeader"
+	TotalBytesTransferredNoticePeriod                = "TotalBytesTransferredNoticePeriod"
+	MeekDialDomainsOnly                              = "MeekDialDomainsOnly"
+	MeekLimitBufferSizes                             = "MeekLimitBufferSizes"
+	MeekCookieMaxPadding                             = "MeekCookieMaxPadding"
+	MeekFullReceiveBufferLength                      = "MeekFullReceiveBufferLength"
+	MeekReadPayloadChunkLength                       = "MeekReadPayloadChunkLength"
+	MeekLimitedFullReceiveBufferLength               = "MeekLimitedFullReceiveBufferLength"
+	MeekLimitedReadPayloadChunkLength                = "MeekLimitedReadPayloadChunkLength"
+	MeekMinPollInterval                              = "MeekMinPollInterval"
+	MeekMinPollIntervalJitter                        = "MeekMinPollIntervalJitter"
+	MeekMaxPollInterval                              = "MeekMaxPollInterval"
+	MeekMaxPollIntervalJitter                        = "MeekMaxPollIntervalJitter"
+	MeekPollIntervalMultiplier                       = "MeekPollIntervalMultiplier"
+	MeekPollIntervalJitter                           = "MeekPollIntervalJitter"
+	MeekApplyPollIntervalMultiplierProbability       = "MeekApplyPollIntervalMultiplierProbability"
+	MeekRoundTripRetryDeadline                       = "MeekRoundTripRetryDeadline"
+	MeekRoundTripRetryMinDelay                       = "MeekRoundTripRetryMinDelay"
+	MeekRoundTripRetryMaxDelay                       = "MeekRoundTripRetryMaxDelay"
+	MeekRoundTripRetryMultiplier                     = "MeekRoundTripRetryMultiplier"
+	MeekRoundTripTimeout                             = "MeekRoundTripTimeout"
+	TransformHostNameProbability                     = "TransformHostNameProbability"
+	PickUserAgentProbability                         = "PickUserAgentProbability"
+	LivenessTestMinUpstreamBytes                     = "LivenessTestMinUpstreamBytes"
+	LivenessTestMaxUpstreamBytes                     = "LivenessTestMaxUpstreamBytes"
+	LivenessTestMinDownstreamBytes                   = "LivenessTestMinDownstreamBytes"
+	LivenessTestMaxDownstreamBytes                   = "LivenessTestMaxDownstreamBytes"
+	ReplayCandidateCount                             = "ReplayCandidateCount"
+	ReplayDialParametersTTL                          = "ReplayDialParametersTTL"
+	ReplayTargetUpstreamBytes                        = "ReplayTargetUpstreamBytes"
+	ReplayTargetDownstreamBytes                      = "ReplayTargetDownstreamBytes"
+	ReplaySSH                                        = "ReplaySSH"
+	ReplayObfuscatorPadding                          = "ReplayObfuscatorPadding"
+	ReplayFragmentor                                 = "ReplayFragmentor"
+	ReplayTLSProfile                                 = "ReplayTLSProfile"
+	ReplayRandomizedTLSProfile                       = "ReplayRandomizedTLSProfile"
+	ReplayFronting                                   = "ReplayFronting"
+	ReplayHostname                                   = "ReplayHostname"
+	ReplayQUICVersion                                = "ReplayQUICVersion"
+	ReplayObfuscatedQUIC                             = "ReplayObfuscatedQUIC"
+	ReplayLivenessTest                               = "ReplayLivenessTest"
+	ReplayUserAgent                                  = "ReplayUserAgent"
+	ReplayAPIRequestPadding                          = "ReplayAPIRequestPadding"
+	APIRequestUpstreamPaddingMinBytes                = "APIRequestUpstreamPaddingMinBytes"
+	APIRequestUpstreamPaddingMaxBytes                = "APIRequestUpstreamPaddingMaxBytes"
+	APIRequestDownstreamPaddingMinBytes              = "APIRequestDownstreamPaddingMinBytes"
+	APIRequestDownstreamPaddingMaxBytes              = "APIRequestDownstreamPaddingMaxBytes"
+	PersistentStatsMaxStoreRecords                   = "PersistentStatsMaxStoreRecords"
+	PersistentStatsMaxSendBytes                      = "PersistentStatsMaxSendBytes"
+	RecordRemoteServerListPersistentStatsProbability = "RecordRemoteServerListPersistentStatsProbability"
+	RecordFailedTunnelPersistentStatsProbability     = "RecordFailedTunnelPersistentStatsProbability"
 )
 )
 
 
 const (
 const (
@@ -416,10 +416,10 @@ var defaultClientParameters = map[string]struct {
 	APIRequestDownstreamPaddingMinBytes: {value: 0, minimum: 0},
 	APIRequestDownstreamPaddingMinBytes: {value: 0, minimum: 0},
 	APIRequestDownstreamPaddingMaxBytes: {value: 1024, minimum: 0},
 	APIRequestDownstreamPaddingMaxBytes: {value: 1024, minimum: 0},
 
 
-	PersistentStatsMaxStoreRecords:        {value: 200, minimum: 1},
-	PersistentStatsMaxSendBytes:           {value: 65536, minimum: 1},
-	RecordRemoteServerListPersistentStats: {value: true},
-	RecordFailedTunnelPersistentStats:     {value: true},
+	PersistentStatsMaxStoreRecords:                   {value: 200, minimum: 1},
+	PersistentStatsMaxSendBytes:                      {value: 65536, minimum: 1},
+	RecordRemoteServerListPersistentStatsProbability: {value: 1.0, minimum: 0.0},
+	RecordFailedTunnelPersistentStatsProbability:     {value: 0.0, minimum: 0.0},
 }
 }
 
 
 // IsServerSideOnly indicates if the parameter specified by name is used
 // IsServerSideOnly indicates if the parameter specified by name is used

+ 4 - 4
psiphon/serverApi.go

@@ -564,8 +564,8 @@ func confirmStatusRequestPayload(payloadInfo *statusRequestPayloadInfo) {
 func RecordRemoteServerListStat(
 func RecordRemoteServerListStat(
 	config *Config, url, etag string) error {
 	config *Config, url, etag string) error {
 
 
-	if !config.GetClientParameters().Bool(
-		parameters.RecordRemoteServerListPersistentStats) {
+	if !config.GetClientParameters().WeightedCoinFlip(
+		parameters.RecordRemoteServerListPersistentStatsProbability) {
 		return nil
 		return nil
 	}
 	}
 
 
@@ -604,8 +604,8 @@ var failedTunnelErrStripIPAddressRegex = regexp.MustCompile(
 func RecordFailedTunnelStat(
 func RecordFailedTunnelStat(
 	config *Config, dialParams *DialParameters, tunnelErr error) error {
 	config *Config, dialParams *DialParameters, tunnelErr error) error {
 
 
-	if !config.GetClientParameters().Bool(
-		parameters.RecordFailedTunnelPersistentStats) {
+	if !config.GetClientParameters().WeightedCoinFlip(
+		parameters.RecordFailedTunnelPersistentStatsProbability) {
 		return nil
 		return nil
 	}
 	}